我用谷歌搜索这个已经筋疲力尽,但我一直无法找到明确的答案或帮助自己理解出了什么问题。作为家庭作业的一部分,我试图为字符数组(即 CString)动态分配内存并分配一个 char 指针变量指向它,然后在结束程序之前删除分配的内存。我只是在思考指针,所以我怀疑我对幕后发生的事情的一些理解是不正确的,我最终使用 Visual Studio 2010 给我堆损坏断点。
这是我正在尝试做的事情的简化版本(我的评论表明我认为我正在做的事情):
char *chPtr = new char[10]; // Create a char pointer type variable, and point it at the memory allocated for a char array of length 10
chPtr = "September"; // Assign 9 characters (+1 null terminator character) to the char array
cout << chPtr; // Prints "September", then finds the null terminator and stops printing
delete [] chPtr; // THIS is what causes my heap corruption -> But I don't know why. Shouldn't this delete the array of memory that chPtr is pointing at?
- 我试过使用
delete chPtr
同样,具有相同的堆损坏结果。 - 我试过手动为数组的末尾分配一个空终止符
chPtr[9] = '\0';
,但这也会导致堆损坏。为什么?当我做cout << chPtr[7];
之类的事情时,我可以从数组中访问单个字符等没有任何问题...
真正令人困惑的是,这可以正常工作:
char *chPtr = new char[10]; // As above, create a char pointer type and point it at the memory allocated for a char array of length 10
delete chPtr; // This doesn't give any error!
似乎通过分配一个值来初始化数组对我来说是一种破坏。
谁能帮帮我?
最佳答案
chPtr = "September";
更改 chPtr
指向的位置。它不再指向分配 10 个 char
的数组的位置,而是指向静态字符数组“September”。然后您尝试删除它,但失败了。
作为测试,你可以试试这个:
char* p = nullptr;
std::cout << static_cast<void*>(p) << "\n";
p = new char[10];
std::cout << static_cast<void*>(p) << "\n";
p = "September";
std::cout << static_cast<void*>(p) << "\n";
可能的输出是:
00000000
0068C988
00D18B34
您可以看到 p
指向的地址在每次赋值时都会发生变化。在空闲存储区 (0068C988
) 上分配的 block 在第三次分配时丢失。
如果你想分配字符,做类似的事情
std::strcpy(chPtr, "September");
这伴随着内存管理、数组和指针的所有注意事项。你真正想做的是:
std::string s = "September";
std::cout << s;
关于c++ - CStrings 和指针 : Heap corruption when trying to delete a character array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30562533/