通过字符串堆坏

时间:2014-09-05 17:38:42

标签: c++ string char heap corruption

假设我有这段代码

void someFunction(args..) {
 char array[4];
 array[0] = 'a';
 array[1] = 'b';
 array[2] = 'c';
 array[3] = 'd';
}

基本上,我所得到的是没有' \ 0'在数组的末尾。 当我们离开这个函数时,数组[]被解除分配 - 对吧?事实上,没有' \ 0'最后的标志导致堆腐败?如果这些功能经常出现怎么办?如果我这样做是这样的:

void someFunction(args..) {
 char* array = new char[4];
 array[0] = 'a';
 array[1] = 'b';
 array[2] = 'c';
 array[3] = 'd';
 //and now i dont call 
 //delete array;
}

提前感谢您的帮助! :)

2 个答案:

答案 0 :(得分:3)

不,两种情况都不会导致堆损坏。

终止空字符用于将字符串的结尾发送到库函数。你这里没有使用任何库函数。

在第一种情况下,数组在堆栈上分配,并给出精确的大小(4)。当调用该函数时,堆栈指针将递减到足以为此变量添加空间,并且当它返回时,堆栈指针将增加相同的量。数组的实际内容(包括是否存在任何空终止字符)对此过程完全没有影响。

你的第二种情况会导致内存泄漏,但仍然不会导致堆损坏,因为 - 再次 - 你没有将指针用于任何期望它的库函数。

答案 1 :(得分:2)

  

当我们离开此功能时,array[]被取消分配 - 对吗?

是。与任何自动变量一样,当程序离开其范围时,它会被销毁。

  

事实上没有' \ 0'最后的标志会导致堆损坏吗?

除非你写的元素超出范围,否则它不会破坏任何东西;也许通过将它传递给像strcpy这样可以写入任意数量字符的函数。但只是创造它,在其范围内写作,并摧毁它不会造成任何伤害。 (无论如何,它不太可能破坏堆,因为它在堆栈上)。

只有将数组内容解释为C风格字符串的代码才需要终止符。一般来说,不需要终止数组,并且在C ++中使用终止字符串是相当不寻常的,它具有更方便的std::string类型。

  

如果这些功能经常发生怎么办?

没问题。每次,在函数的堆栈帧上创建数组,该函数返回时释放。

  

如果我执行此操作,它是否相同:[new没有delete]

这导致内存泄漏,因为您正在分配动态数组但从不释放它。再一次,它不会破坏任何东西,因为你只是在数组范围内写作;但是如果你继续泄漏,那么最终你会失去记忆。