C++ 什么';s C+中new和delete的内存行为+;?

C++ 什么';s C+中new和delete的内存行为+;?,c++,compilation,C++,Compilation,我说的是记忆标志的行为。我注意到在堆内存I new之前将有12个字节的内存标志。删除堆内存后,标志发生了变化。比如: auto A = new A; 00 00 00 00 59 1f 12 04 7d bf 00 0c | the heap memory of A | delete A; 00 00 00 00 59 1f 12 04 4e bf 00 0c | the heap memory of A | 此外,删除后内存的其他部分也会发生变化。 在这里,我只想弄清楚new和delete操

我说的是记忆标志的行为。我注意到在堆内存I new之前将有12个字节的内存标志。删除堆内存后,标志发生了变化。比如:

auto A = new A;
00 00 00 00 59 1f 12 04 7d bf 00 0c | the heap memory of A |
delete A;
00 00 00 00 59 1f 12 04 4e bf 00 0c | the heap memory of A |
此外,删除后内存的其他部分也会发生变化。 在这里,我只想弄清楚new和delete操作之后内存会发生什么变化。以及如何解码堆内存前面的12字节数据。
顺便说一句,我使用VS2017作为编译工具。

C++没有定义它,因为它不重要。编译器和运行时基本上可以做他们想做的任何事情,调试和发布之间可能会有很大的不同。你说的“堆栈内存”是什么意思?这能回答你的问题吗?因此,使用Visual C++编译器,您想知道是否发布了一些内容。你的直觉是在堆栈上的指针位置可能有线索。你可能会想重新表述你的问题,因为在那个时候我们已经离开了一般C++的问题。作为一个一般的规则,你不能确定“已经发布”,因为内存可以立即重用,例如说“代码>删除P;p2=新的A;p==p2是可能的。如果您想为了“之前已经发布”的目的跟踪它,您可以在objects析构函数中放入一些东西,以便进行调试。“valgrind”有时在这方面也很有用,我不知道Windows/Microsoft是否有类似的工具。好吧,你可以试着通过实验来弄清楚情况是否如此。VisualStudio有一个相当方便的“disassembly”视图,因此您可以逐步了解
新建一个
删除一个
的实际操作,并查看其中是否有任何提示,但在我看来,这就像是深入研究
RtlAllocateHeap
,这意味着要阅读大量汇编程序。如果它总是
A
对象,并且您可以进行“特殊构建”,那么向构造函数和析构函数添加一些跟踪以记录/跟踪可能是最简单的。然后,您可以查看指针
a*
在释放、双重删除等之后是否被使用。