尝试删除对象(C++)时检测到堆损坏
Heap Corruption Detected when trying to delete an object (C++)
我在程序结束时删除对象时遇到问题。这是针对C++课程的,所以我们还不允许使用字符串类。我有一个Weapon类,它为武器生成一个名称,这个名称用char* result = new char[len]
实例化,然后返回给构造函数。在析构函数中,我用delete[] this->name
移除name对象。
问题:
当我运行程序时,一切都运行良好,直到程序进入程序的删除部分。然后我得到这个错误消息:
调试错误!
程序:。。。程序的路径。。。
检测到HEAP腐蚀:在0x0100B918的正常块(#198)之后。CRT检测到应用程序在堆结束后写入内存缓冲器
(按"重试"调试应用程序)
我试着用delete[]替换delete,反之亦然,这没有什么区别。
有人能认出我想错的地方吗?
main.cpp:
int _tmain(int argc, _TCHAR* argv[]) {
// ... code ...
Weapon* weapon = new Weapon();
// ... code ...
delete weapon;
}
Weapon.cpp:
Weapon::Weapon() {
this->name = this->generateName();
// more properties...
}
Weapon::~Weapon() {
delete[] this->name;
this->name = nullptr;
}
char* Weapon::generateName() {
int pr, tp, su; // random variables for picking prefix, type and suffix
const char *prefix[10] = { // ... a bunch of names ... };
const char *type[10] = { // ... a bunch of names ... };
const char *suffix[10] = { // ... a bunch of names ... };
pr = rand() % 9;
tp = rand() % 9;
su = rand() % 9;
int len = strlen(prefix[pr]) + strlen(type[tp]) + strlen(suffix[su]) + 1;
char *result = new char[len]();
strcpy(result, prefix[pr]);
strcat(result, " ");
strcat(result, type[tp]);
strcat(result, " ");
strcat(result, suffix[su]);
return result;
}
您忘记在字符串中为空间分配空间:
int len = strlen(prefix[pr]) + strlen(type[tp]) + strlen(suffix[su]) + 1;
应该是:
int len = strlen(prefix[pr]) + 1 + strlen(type[tp]) + 1 + strlen(suffix[su]) + 1;
这两个额外的字符将覆盖分配块之外的内存,这说明了检测到的堆损坏。
相关文章:
- 检测到堆损坏:在正常块 c++ 动态 2D 数组之后
- 删除字符串后C++检测到堆损坏
- 检测到堆损坏(字符串导致堆损坏)|C++
- 在C++中检测到堆损坏错误
- C++ 内存损坏检测
- 如何修复检测到堆损坏:正常阻止后
- 在复制 delete[] 数组后在 C++ 中检测到堆损坏
- 从检测到 glibc 正常退出 - malloc():内存损坏
- 编译器如何检测内存损坏
- 排序程序的错误(检测到堆损坏)
- 正常块错误后检测到的堆损坏
- C++ 删除数组时检测到堆损坏
- 调试错误,在C++中检测到堆损坏
- 检测到堆损坏(类方法)
- 在普通块(#164)之后检测到堆损坏
- jemalloc未检测到内存损坏
- 检测到合并排序堆损坏
- 错误: *** 检测到 glibc *** w5:双重释放或损坏(快速顶部):
- 检测到堆损坏:在正常块(#62)之后
- 在Windows上立即检测到堆损坏错误.如何