Nic*_*edt 1 c++ arrays object string-literals
我在程序结束时删除对象时遇到问题.这是一个C++课程,所以我们不允许使用字符串类(尚).我有一个武器类,它为武器生成一个名称,这个名称被实例化,char* result = new char[len]然后返回给构造函数.在析构函数中,我删除了名称对象delete[] this->name.
问题:
当我运行我的程序时,一切运行正常,直到程序进入程序的删除部分.然后我收到此错误消息:
调试错误!
计划:...计划之路......
HEAP CORRUPTION DETECTED:正常块(#198)后0x0100B918.CRT检测到应用程序在堆缓冲区结束后写入内存.
(按"重试"调试应用程序)
我尝试用删除[]替换删除,反之亦然,它没有任何区别.
任何人都可以找到我想错的地方吗?
main.cpp中:
int _tmain(int argc, _TCHAR* argv[]) {
// ... code ...
Weapon* weapon = new Weapon();
// ... code ...
delete weapon;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
你忘了在字符串中为空格分配空间:
int len = strlen(prefix[pr]) + strlen(type[tp]) + strlen(suffix[su]) + 1;
Run Code Online (Sandbox Code Playgroud)
应该 :
int len = strlen(prefix[pr]) + 1 + strlen(type[tp]) + 1 + strlen(suffix[su]) + 1;
Run Code Online (Sandbox Code Playgroud)
两个额外的字符将覆盖分配的块之外的内存,这会占检测到的堆损坏.
| 归档时间: |
|
| 查看次数: |
484 次 |
| 最近记录: |