按字符串堆损坏

Heap corruption by strings

本文关键字:损坏 字符串      更新时间:2023-10-16

假设我有这段代码

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

提前感谢您的帮助! :)

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

终止 null 字符用于向库函数发出字符串结束的信号。 您在此处未使用任何库函数。

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

第二种情况将导致内存泄漏,但仍然不会导致堆损坏,因为 - 同样 - 您不会将指针与任何期望它的库函数一起使用。

当我们离开这个函数时,array[]被取消分配 - 对吧?

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

末尾没有"\0"符号的事实会导致堆损坏吗?

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

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

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

没关系。每次,数组都是在函数的堆栈帧上创建的,当函数返回时释放。

如果我这样做是否相同:[ 没有delete new ]

这会导致内存泄漏,因为您正在分配动态数组,但永远不会释放它。同样,它不会损坏任何东西,因为您只在数组范围内写入;但是如果你继续泄漏,那么最终你会耗尽内存。