什么是';销毁';C++;? 我想知道内存中发生了什么,被C++中的“删除”操作符所破坏。 以这种方式“销毁”内存是否意味着将给定的内存设置为0或其他内容?

什么是';销毁';C++;? 我想知道内存中发生了什么,被C++中的“删除”操作符所破坏。 以这种方式“销毁”内存是否意味着将给定的内存设置为0或其他内容?,c++,memory,C++,Memory,delete只释放内存(以前由new分配),如果此内存中存储了某个对象,也会调用析构函数 delete不会更改指针的值,也不会修改已释放的内存,因此您会注意到,许多人在调用delete后会将NULL分配给该指针,以确保他们不会取消引用无效(悬空)指针,这会产生未定义的行为 值得一看:它正在销毁(如调用相关的析构函数)传递给delete的对象实例,然后“释放”内存以便用于其他目的 < > C++标准没有说明在代码> >删除< /代码>之后内存的内容,它肯定不能保证是零或任何其他值,也不能保证它不是

delete
只释放内存(以前由
new
分配),如果此内存中存储了某个对象,也会调用析构函数

delete
不会更改指针的值,也不会修改已释放的内存,因此您会注意到,许多人在调用
delete
后会将
NULL
分配给该指针,以确保他们不会取消引用无效(悬空)指针,这会产生未定义的行为

值得一看:

它正在销毁(如调用相关的析构函数)传递给
delete
的对象实例,然后“释放”内存以便用于其他目的

< > C++标准没有说明在代码> >删除< /代码>之后内存的内容,它肯定不能保证是零或任何其他值,也不能保证它不是零-它可能是零,它可以保留它以前的所有值,或者它的某些部分可能被改变,而其他部分保持不变。 < C和C++的语言目标是“只做最小必要”,所以一个典型的内存不会覆盖“旧”内存。p> 当然,在释放内存之前,可以使用析构函数中的代码将内存设置为零


既然你不应该在内存被删除后再使用它,那就没什么大不了的了

否,这并不意味着将内存设置为任何特定值+。内存只是返回到可重用的值堆中。运行时通常使用返回块的几个字节来存储“簿记”信息,但它们不会将整个块设置为特定值。一旦内存块被重用,您的程序就可以设置它的新值



+有一些内存分析工具可以让您将释放的内存设置为一些“垃圾”值,以确保更快地崩溃。

看看这个问题,我认为这是一个好问题,因为标准本身似乎有点不清楚“销毁”到底是什么。它说,C++的构造用于创建、销毁和操纵对象和对象是存储区域。然而,它也表示析构函数用于销毁对象,但是我们可以显式调用析构函数,并且仍然可以使用存储区域。(也许我对待这个问题的深度比它真正要求的要深)@Armin好的,我看了看,thx。你通常会说内存是“释放的”(或者“释放的”或者“释放的”)而不是“破坏的”。术语“销毁”更常用于描述内存中的对象发生了什么。推荐memset是最好的bug来源。你所说的关于V表(C++没有指定,它只是一个实现技术)对所有的类成员都是有效的:如果它们是非平凡的对象,它们也有在类DRTR返回之后必须执行的析构函数。如果你删除了内存,你就误导了一切。好吧,删除了memset的建议,因为很难解释它什么时候可以使用,什么时候不能使用——总之,这样做是毫无意义的。永远不要使用它。C++管理对象,而不是内存。除非您正在编写原始分配器类(a-la
std::allocator
)或重写
new
/
delete
,否则决不能将内存作为“裸机”进行接口。