按字符串堆损坏
Heap corruption by strings
假设我有这段代码
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
]
这会导致内存泄漏,因为您正在分配动态数组,但永远不会释放它。同样,它不会损坏任何东西,因为您只在数组范围内写入;但是如果你继续泄漏,那么最终你会耗尽内存。
- 删除字符串后C++检测到堆损坏
- 检测到堆损坏(字符串导致堆损坏)|C++
- 我的 c 字符串复制函数正在损坏其他变量的堆栈
- 字符串标记化期间的内存损坏
- 放置在外部 DLL 中的类中的字符串数据的内存损坏
- 标准::字符串中的堆损坏
- C#到C代码P/调用多个std:字符串声明导致堆栈损坏
- 为了验证std::字符串是否已损坏,您将执行哪些调试验证
- 使用时间函数后,字符串已损坏
- 字符指针指向字符串,然后指向字符串数组。"./a.out"中的错误:malloc():内存损坏:0x0900c3b0***
- C++ - 删除标准::字符串*;堆损坏
- CPUID品牌字符串损坏
- 第二个字符串在多次重新分配调用后损坏
- Visual Studio 2008:字符串文字"??-"、"??'"、"??="损坏
- C++ iostream 使用字符串流的损坏
- 烟囱损坏;使用字符串进行位操作;MSVC++
- 从文件读取时字符串已损坏
- 按字符串堆损坏
- c# COM字符串在c++ BSTR中被损坏
- 变量损坏c++字符串Visual Studio 2005