gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:13:53 24 4
gpt4 key购买 nike

我在程序末尾删除对象时遇到问题。这是针对 C++ 类(class)的,因此我们还不允许使用字符串类(目前)。我有一个生成武器名称的 Weapon 类,这个名称是用 char* result = new char[len] 实例化的,然后返回给构造函数。在析构函数中,我使用 delete[] this->name 删除了名称对象。

问题:

当我运行我的程序时,一切正常,直到程序运行到程序的删除部分。然后我收到此错误消息:

Debug Error!

Program: ... path to program ...

HEAP CORRUPTION DETECTED: after Normal block (#198) at 0x0100B918. CRT detected that the application wrote to memory after end of heap buffer.

(Press Retry to debug the application)

我试过用 delete[] 替换 delete,反之亦然,但没有任何区别。

谁能看出我哪里错了?

主要.cpp:

int _tmain(int argc, _TCHAR* argv[]) {

// ... code ...

Weapon* weapon = new Weapon();

// ... code ...

delete 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;

这两个额外的字符会覆盖分配 block 之外的内存,这就是检测到的堆损坏的原因。

关于c++ - 尝试删除对象时检测到堆损坏 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30984048/

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