gpt4 book ai didi

c++ - Visual Studio C++ "ProjectName.exe has triggered a breakpoint"等问题

转载 作者:太空狗 更新时间:2023-10-29 20:55:39 27 4
gpt4 key购买 nike

我已经调查过这个问题,但我还没有真正收到好的答案,所以我想我应该在这里提问。

我正在使用 C++ 开发一个涉及一些内存操作的项目(分配动态字符数组并使用 placement new 将内存地址和完整对象放入这些数组中)。

每次在 Visual Studio 中调试程序时,我都会遇到一个非常令人沮丧的问题:弹出一条消息,通常说“ProjectName.exe 已触发断点”。有时会说类似“在 2 中的 0x0FFD66CB (ucrtbased.dll) 抛出的异常 - Kennel.exe:0xC0000005:访问冲突读取位置 0xFFFFFFF5。”

这是相关类的代码

目录.h

#ifndef CAT_H
#define CAT_H

#include <string>
#include "Kennel.h"

using std::string;

class Cat {
private:
static Kennel catKennel;
int _id;
string _name;

Cat(int i, const string& nm) : _name(nm) { // Note initializer list
_id = i;
}

void* operator new(size_t size){
return catKennel.allocate();
}
public:
static Cat* create(int id, const string& name) { // Factory method
return new Cat(id, name);
}

void operator delete(void* loc) {
catKennel.deallocate(loc);
}
};

Kennel Cat::catKennel(sizeof(Cat), 5);

#endif

犬舍.h

#ifndef KENNEL_H
#define KENNEL_H

#include <cstddef>
#include <cassert>
#include <iostream>
#include <new>

class Kennel {
private:
static const size_t _BUCKET_COUNT = 10;
const size_t _BUCKET_SIZE;
const size_t _ELEM_SIZE;
char* buckets[_BUCKET_COUNT];
//char** buckets;
char* availableBlock;
public:
Kennel(size_t elemSize, size_t bucketSize = 5);
~Kennel();
void* allocate(); // Get a pointer inside a pre-allocated block for a new object
void deallocate(void*); // Free an object's slot (push the address on the "free list")
};

#endif

犬舍.cpp

#include "Kennel.h"

Kennel::Kennel(size_t elemSize, size_t bucketSize) : _ELEM_SIZE(elemSize), _BUCKET_SIZE(bucketSize) {
//Set each element in buckets to nullptr.
for (int i = 0; i < _BUCKET_COUNT; i++)
buckets[i] = nullptr;
}

Kennel::~Kennel() {
//Delete each character array in buckets.
for (int i = 0; i < _BUCKET_COUNT; i++) {
if (buckets[i] != nullptr)
delete[] buckets[i];
}
}

void* Kennel::allocate() {
//If there is no available bucket: create a new one.
if (availableBlock == nullptr) {
//Find next array index in buckets array where we can create a new bucket.
int nextNullBucketIndex = -1;
for (int i = 0; i < _BUCKET_COUNT; i++) {
if (buckets[i] == nullptr) {
nextNullBucketIndex = i;
break;
}
}
assert(nextNullBucketIndex > -1); //If there is no space to create another bucket: exit.

//Create a new bucket.
buckets[nextNullBucketIndex] = new char(_BUCKET_SIZE * _ELEM_SIZE);
availableBlock = buckets[nextNullBucketIndex];
char* tempBlock = availableBlock;

//Put the address of the next block inside each block.
std::cout << "Bucket " << nextNullBucketIndex << ": ";
for (int i = 0; i < _BUCKET_SIZE - 1; i++) {
std::cout << static_cast<void*>(tempBlock) << ' ';
new (tempBlock) char*(tempBlock += _ELEM_SIZE);
}
std::cout << static_cast<void*>(tempBlock) << std::endl;
new (tempBlock) char*(nullptr); //The last block doesn't get an address, put nullptr in it.
}

char* tempAvailable = availableBlock;
availableBlock = *reinterpret_cast<char**>(availableBlock);

std::cout << "Returning: " << static_cast<void*>(tempAvailable) << std::endl;
return static_cast<void*>(tempAvailable);
}

void Kennel::deallocate(void* loc) {
new (loc) char*(availableBlock); //Store availableBlock's contained address in loc.
availableBlock = static_cast<char*>(loc); //Set availableBlock's contained address to be loc's address.
}

每次运行我的程序时问题都不同。以下是有关我在尝试运行它时遇到的更常见问题的一些信息。

尝试在分配中执行 Kennel.cpp 第 48 行时经常中断

std::cout << "Returning: " << static_cast<void*>(tempAvailable) << std::endl;

它经常在我删除 Cat 对象的主函数中的一行中断。

在调用 Kennel 的解构函数时,它有时会在程序结束时中断。

等等...

正如我所说,它决定中断哪一行代码似乎是随机的。此外,我几乎可以肯定问题出在 Kennel 类上,因为我使用了我 friend 的 Kennel.h 和 Kennel.cpp 的代码,并且它运行完美。

如有任何帮助,我们将不胜感激。

最佳答案

buckets[nextNullBucketIndex] = new char(_BUCKET_SIZE * _ELEM_SIZE);

这只分配了一个char,而不是一个数组。然后,您继续将内容写入您不拥有的内存中。 std::stringnew 相同的内存,然后你的堆就搞砸了。

关于c++ - Visual Studio C++ "ProjectName.exe has triggered a breakpoint"等问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35214588/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com