c++ - CStrings 和指针 : Heap corruption when trying to delete a character array

标签 c++ arrays pointers c-strings

我用谷歌搜索这个已经筋疲力尽,但我一直无法找到明确的答案或帮助自己理解出了什么问题。作为家庭作业的一部分,我试图为字符数组(即 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/

相关文章:

c++ - C++编译错误

c - 交换函数中的二维数组引用

c - 在C中使用插入排序对字符串进行排序 - 段错误

c++ - 理解 C++ 中的递归

c++ - 外部存储器上的 QDataStream?

arrays - 快速排序字符串中的字符

c - 用静态关键字 : what is static, 声明的数组是指针还是整个数组?

java.lang.ClassCastException : java. util.Arrays$ArrayList 无法转换为 java.lang.Integer

Char 双向链表

c++ - 为什么 ShellExecuteEx 不返回进程句柄?