c++ - 动态内存分配问题

标签 c++ visual-c++ dynamic-memory-allocation

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

char *buffer_heap = new char[15];

它将在内存中表示为:

 ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍýýýý««««««««þþþ

为什么末尾没有 NULL 终止字符而不是 ýýýý««««««««þþþ?

最佳答案

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

随后是 4 个字节的 ν(字节 0xFD),Windows 调试分配器使用它来指示缓冲区末尾的越界区域。这个想法是,如果你发现自己在调试器中写入一个看起来像这样的区域,你可以想“嗯,我可能在这里溢出了我的缓冲区”。此外,如果在释放缓冲区时值已更改,内存分配器会警告您您的代码有误。

« 是字节 0xAB,þ 是 0xFE。大概这些也是为了吸引眼球(它们不是合理的指针或偏移量,因此它们不构成堆结构的一部分)。我不知道它们表示什么,可能是更多的保护数据,例如 0xFD。

最后,我猜,您找到了一个 0 字节,即 15 字节缓冲区末尾之外的第 16 个字节(即从它的开头算起的第 31 个字节)。

将问题作为“C++”而不提及您使用的是 Windows 表明这就是 C++ 的行为方式。它不是,它是 C++ 的一种实现的行为方式,具有特定的编译器选项和/或链接的 dll。 C++ 不允许您读取超过缓冲区的末尾,Microsoft 只是对您很好,让您侥幸逃脱,不会崩溃或更糟。

关于c++ - 动态内存分配问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2300191/

相关文章:

c++ - 将 thread_pool 与 deadline_timer 组合 - 模板问题(时间)

c++ - 浮点提升 : stroustrup vs compiler - who is right?

c - 如何使用 C 中的函数动态初始化数组

c - 哪些对齐问题限制了 malloc 创建的内存块的使用?

c++ - 不可能的事件序列

c - 什么更有效率 : reading from a file or allocating memory

c++ - 有没有办法知道放气(或你的 Z_STREAM)是否有数据被缓冲? zlib C++

C++字符管理

C++11 lambda 返回 lambda

c++ - 在代码中创建工具箱对象(例如标签等)