动态内存分配问题

cpx*_*cpx 11 c++ dynamic-memory-allocation visual-c++

当您使用指针在堆上分配动态内存时,

char *buffer_heap = new char[15];
Run Code Online (Sandbox Code Playgroud)

它将在内存中表示为:

 ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍýýýý««««««««þþþ
Run Code Online (Sandbox Code Playgroud)

为什么最后没有一个NULL终止字符而不是««««««««þþþ?

Ste*_*sop 22

Í是字节0xCD,Windows调试分配器写入您的15字节内存,表明它是未初始化的堆内存.未初始化的堆栈将为0xCC.我的想法是,如果你曾经读过记忆并意外地获得这个价值,你可以自己想一想,"嗯,我可能忘记了这个".此外,如果您将其作为指针读取并取消引用它,那么Windows将使您的进程崩溃,而如果未初始化的缓冲区填充了随机或任意值,那么有时您会得到一个有效的指针,而您的代码可能会导致所有各种麻烦.C++没有说明未初始化内存的值是什么,非调试分配器不会浪费时间为每个分配填充特殊值的内存,所以你绝不能依赖那个值.

接下来是4个字节的ý(字节0xFD),Windows调试分配器使用它来指示缓冲区末尾的越界区域.这个想法是,如果你发现自己在调试器中写了一个看起来像这样的区域,你可以想到"嗯,我可能在这里超出了我的缓冲区".此外,如果释放缓冲区时值已更改,则内存分配器可以警告您代码错误.

«是字节0xAB,þ是0xFE.据推测,这些也可用作引人注目的(它们不是合理的指针或偏移量,因此它们不构成堆结构的一部分).我不知道他们的意思,可能更多的保护数据,如0xFD.

最后,我想,你发现了一个0字节,超出15字节缓冲区末尾的第16个字节(即从它开始计算的第31个字节).

问这个问题是"C++"而没有提到你在Windows上表明这就是C++的行为方式.它不是,它是一个C++实现的行为,特定的编译器选项和/或链接的dll.C++不允许你读取缓冲区的末尾,微软只是对你很好,让你逃脱它不会崩溃或更糟.

  • +1用于详细说明每个十六进制代码,特别是关于调试器的技巧; 也用于解释标记规则 (3认同)

dmc*_*kee 6

您尚未初始化该内存.你只是看到已有的东西......