c++是delete操作符重写内存
C++ is delete operator rewrite memory?
我正在做一个使用MVS 2010 C++
的项目。编译选项是默认的。我认为操作符delete
不重写内存,只标记堆中空闲的内存。我做了一个测试项目,其中字符串由new
操作符动态创建,并由delete
操作符释放。我检查了内存窗口中的内存,在delete
之后内存被覆盖了。这也发生在发行版中。在发布模式下(没有调试),我创建了一个进程转储,并在记事本中搜索字符串。我找到绳子了。然后,我在delete
之后创建了一个转储,并在转储文件中搜索字符串。字符串不存在
我的问题是为什么delete
甚至在发布模式下覆盖字符串?
在许多流行的堆管理实现中,"标记堆中空闲的内存"通常需要重写至少一部分内存。这就是为什么它被"标记为free"。
通常,现在空闲的内存块的一部分实际上被堆管理器用于内部目的(维护空闲块列表等),这种重新利用和随后的重写很可能是您在您的案例中看到的。
通常是被内部重用的空闲块的最开始。在某些实现中,它可能是开始和结束。因此,如果您分配了一个足够长的字符串,您应该能够看到至少该字符串的中心部分在释放的内存块中保持完整。
不要设置得太长,因为堆管理器可能会决定直接从操作系统请求大的内存块,并在它们被释放后返回给操作系统。那完全是另一回事了
使用旧的C语言,您可以释放一个块,并且它将保持有效,直到下一次调用malloc()。但这已经不是真的很长时间了。应用程序经常"撕碎"内存,部分是为了帮助调试,但也是作为一种安全措施,防止其他代码查找垃圾,可能是为了收集密码或其他敏感信息。也可以把内存给另一个进程。
一旦调用了delete,内存管理器就可以自由地对内存执行任何操作。任何事情都可能发生,包括:
- 它可以覆盖用于调试目的
- 将块添加到空闲内存池
- 合并释放块。
- 块被重新分配并写入其他地方(例如在库函数中)。
- 内存排序或读取-修改-写入操作,仅(读/写)内存顺序
- 特定共享内存写操作(MPI)的同步
- read() 上的不同行为取决于写入不可写内存时表示文件、匿名管道或套接字的文件描述符
- 将几行代码写成一行是有益的(就内存和空间复杂性而言)。值得吗?
- 正在重写MSVC++中的内存分配器
- 内存读/写错误异常
- 尝试读/写受保护的内存错误,同时固定 c++ 函数
- 在内存上写视频OpenCV2
- c++中的内存使用和重写
- 如何释放 C++/C 格式的内存?我什么时候会写自由(a);?函数是重新指针
- 如何读/写矢量<块*>作为内存映射文件?
- 提升内存映射文件:读写访问
- 更有效地使用fork()和写时复制内存共享
- 共享内存C++读写同步
- mmap被破坏,是malloc重写内存中的元素
- 使用调试权限和读/写内存打开进程
- c++ boost写内存映射文件
- 矢量函数"push_back"不断将值重写到内存中的同一插槽
- 我如何编辑操作码或写内存或编辑字节在c++
- pthread_cond_signal或pthread_cond_broadcast调用是否隐含写内存屏障?