2013-04-27 61 views
2

我想知道在C++中由“删除”运算符销毁的内存会发生什么情况。 以这种方式“销毁”记忆意味着将给定的记忆片段设置为0或其他东西?在C++中,删除操作符意味着'销毁'内存?

+0

看看这个http://www.cplusplus.com/reference/new/operator%20delete%5B%5D/ – 2013-04-27 11:27:18

+0

我认为这是一个很好的问题,因为标准本身似乎有点不清楚什么确切的说是“破坏”。它说C++的构造被用来创建,销毁和操纵对象,而对象则是存储区域。然而,它也表示析构函数用于销毁对象,但我们可以明确地调用析构函数并仍然有可用的存储区域。 (也许我正在对待这个问题的深度比它真正要求的更高) – 2013-04-27 11:33:08

+0

@Armin好的,我看了看,thx。 – Zygmuntix 2013-04-27 11:33:37

回答

6

它破坏(如在呼吁有关析构函数)传递给delete对象实例,然后“释放”的内存中,因此它可以被用于其它目的。

C++标准没有说明在delete之后内存的内容是什么,它肯定不能保证为零或任何其他值 - 也不能保证它不为零 - 它可能是零,它可能保留以前的所有价值,或者其中一些部分可能会被改变,而其他部分可能会保持不变。

C和C++作为语言的目标是“只做最低限度的必要”,因此典型的免费内存不会覆盖“旧”内存。

你可以使用析构函数中的代码将内存设置为零,然后释放它。

由于在删除内容后不应使用内存,因此这应该不是问题。

+0

推荐memset是最好的bug源。你所说的V-tables(C++没有指定的东西,它只是一种实现技术)对所有的类成员都是有效的:如果它们是非平凡的对象,它们也有必须在class dtor返回。如果你消除了记忆,你会误导一切。 – 2013-04-27 12:57:46

+0

好的,删除了memset的建议,因为很难解释它什么时候可以使用也无法使用 - 无论如何,通常这样做是毫无意义的。 – 2013-04-27 13:03:20

+0

千万不要使用它。 C++管理对象,而不是内存。除非你正在编写一个原始分配器类(a-la'std :: allocator')或者重写'new' /'delete',否则你不应该将内存作为“裸机”来连接。 – 2013-04-27 13:23:04

4

delete只是释放内存(以前由new分配),并且在某些对象已存储在此内存中的情况下,也会调用析构函数。

delete不会更改指针的值,也不会修改已释放的内存,因此您会注意到很多人在调用delete后才会将NULL指定给该指针,以确保它们将不会导致无效(悬挂)指针,其产生未定义的行为

值得去看一看:Is it good practice to NULL a pointer after deleting it?

3

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


+有内存分析工具,让您设定内存释放一些“垃圾”的价值观,以确保你得到一个崩溃得更快。