2012-03-29 76 views
0

我在这里停留在我的C++的书有以下问题:“什么不使用新的要求你也呼吁删除”新的使用要求您还需要调用delete吗?

也许你有一个答案呢?

+0

答案肯定会在你的书中。虽然有人可以(也将会)在此提供,但自己回答并不难。如果您已经这么做但想要确认,请编辑问题并告诉我们您为什么这么做。 – Jon 2012-03-29 06:37:11

+0

我一直在寻找它,这只是讨论问题 – Sebastian 2012-03-29 06:37:50

+0

我认为你的意思是“为什么”,而不是“什么”。 – Wyzard 2012-03-29 06:41:04

回答

1

因为这是C++设计的方式&这是预期的行为。
意图是提供一个内存分配,你需要和拥有,直到你明确地重新调整它。

new给你一个动态内存分配(在堆上),它将继续存在,你拥有它,直到你明确地释放它,通过调用delete
未能在new ed缓冲区上调用delete将导致 未定义的行为通常以 的形式。 1内存泄漏。

1这被讨论了here

+0

哦,好吧我想这就是他们正在寻找的内存泄漏的想法,如果你不再次删除对象。 – Sebastian 2012-03-29 06:38:56

+2

这是不正确的。没有未定义的行为来调用'delete',并且有些情况下(例如单例)你不想在'new'内存中调用'delete'。 – 2012-03-29 07:21:53

1

当您执行new时,OS会将内存分配给您指定的指针。使用完成后,您可能不再需要它了。但内存仍被标记为“正在被操作系统”使用。

现在,当指针在函数或任何其他块({})的作用域中声明时,当块的执行结束时,它将被删除(只有指针将被删除)。在这种情况下,使用new分配的内存仍被OS标记为“正在使用”,并且未分配给调用new或变量的任何其他指针。这会导致RAM中的孤立内存块,永远不会被使用,因为它的指针已从内存中移除,但会占用内存块。

这被称为内存泄漏。一些这样的块可能会让你的应用程序不稳定。

您使用delete释放这样的内存块,减轻操作系统,以便它可以为其它请求

1

有一个在C++没有垃圾收集器可以很好地使用,因此,你是负责释放所分配的内存。无论如何,操作系统“知道”你的程序分配了什么内存。所以当你的程序退出时,操作系统再次对内存负责。但是如果你有一个长时间运行的C++程序,并且从来不会调用delete,那么没有人会帮你摆脱垃圾。

+0

您可以在C++中使用垃圾收集器。但是'delete'不仅仅是简单的内存管理,它也调用析构函数。即使使用垃圾收集器,通常也需要使用'delete'。 – 2012-03-29 07:24:26

1

调用new为对象分配了内存,并且还安排了该对象的构造函数被执行。

您可以通过调用free()来释放内存,但实际上应该使用delete来释放由new分配的内存,因为这也会导致对象析构函数被执行。

相关问题