c++是delete操作符重写内存

C++ is delete operator rewrite memory?

本文关键字:重写 写内存 操作符 delete c++      更新时间:2023-10-16

我正在做一个使用MVS 2010 C++的项目。编译选项是默认的。我认为操作符delete不重写内存,只标记堆中空闲的内存。我做了一个测试项目,其中字符串由new操作符动态创建,并由delete操作符释放。我检查了内存窗口中的内存,在delete之后内存被覆盖了。这也发生在发行版中。在发布模式下(没有调试),我创建了一个进程转储,并在记事本中搜索字符串。我找到绳子了。然后,我在delete之后创建了一个转储,并在转储文件中搜索字符串。字符串不存在

我的问题是为什么delete甚至在发布模式下覆盖字符串?

在许多流行的堆管理实现中,"标记堆中空闲的内存"通常需要重写至少一部分内存。这就是为什么它被"标记为free"。

通常,现在空闲的内存块的一部分实际上被堆管理器用于内部目的(维护空闲块列表等),这种重新利用和随后的重写很可能是您在您的案例中看到的。

通常是被内部重用的空闲块的最开始。在某些实现中,它可能是开始和结束。因此,如果您分配了一个足够长的字符串,您应该能够看到至少该字符串的中心部分在释放的内存块中保持完整。

不要设置得太长,因为堆管理器可能会决定直接从操作系统请求大的内存块,并在它们被释放后返回给操作系统。那完全是另一回事了

使用旧的C语言,您可以释放一个块,并且它将保持有效,直到下一次调用malloc()。但这已经不是真的很长时间了。应用程序经常"撕碎"内存,部分是为了帮助调试,但也是作为一种安全措施,防止其他代码查找垃圾,可能是为了收集密码或其他敏感信息。也可以把内存给另一个进程。

一旦调用了delete,内存管理器就可以自由地对内存执行任何操作。任何事情都可能发生,包括:

  1. 它可以覆盖用于调试目的
  2. 将块添加到空闲内存池
  3. 合并释放块。
  4. 块被重新分配并写入其他地方(例如在库函数中)。
如果你期望你的数据在你删除的时候不会被覆盖,那是不现实的。