尝试删除对象(C++)时检测到堆损坏

Heap Corruption Detected when trying to delete an object (C++)

本文关键字:检测 损坏 C++ 删除 对象      更新时间:2023-10-16

我在程序结束时删除对象时遇到问题。这是针对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;

这两个额外的字符将覆盖分配块之外的内存,这说明了检测到的堆损坏。