5

为了这个问题,我将把内存想象成一个简单的字节数组,我将谈论堆内存,因为它可以动态分配。

假设我正在实例化某个类,并在已经分配了一些内存的堆上创建一个对象。然后,在创建对象之后,我分配了更多内存(可能通过实例化另一个类)。当然,这意味着使用newanddelete关键字。

内存现在看起来像这样:

... byte byte my_object ... my_object byte byte ...

执行时究竟会发生什么delete my_object;?所有其他内存都向左移动了sizeof(MyClass)吗?如果是这样,由谁?操作系统?那么当没有操作系统提供虚拟内存时会发生什么?

4

4 回答 4

6

不,没有任何变化。相反,内存变得碎片化,这意味着您现在在已用内存中间有一个未使用的洞。随后的分配可能能够重新使用部分或全部该内存(前提是请求的字节数足够小以适合该孔)。

一些语言/环境支持压缩垃圾收集器。这样的收集器可以移动物体,因此如果他们愿意,可以消除孔洞。这种方法实现起来很复杂,因为收集器需要知道程序中每个指针的位置。因此,这种类型的收集器更适合高级语言。

于 2013-01-03T20:03:01.467 回答
2

如果内存被转移,那将是一个非常糟糕的操作系统 IMO。通常,会通知操作系统该内存可用于重用。它甚至不需要被清除(大部分时间都不需要)。当无法分配更多内存时,您通常会收到异常(如果您正在使用new)或返回 NULL 指针(如果您正在使用malloc)。

如果碎片是一个问题(有时是),你必须编写自己的内存池您可以使用(现有的)内存池来处理这个问题,但即便如此,大部分责任仍然落在程序员身上。

于 2013-01-03T20:03:20.057 回答
2

内存不会向左移动。想象一下如果是的话会发生什么。所有那些“在右边”的指针都将变得无效。

于 2013-01-03T20:05:01.070 回答
1

在典型的实现中(例如,没有移动垃圾收集器)不会移动任何内容。

Bames53 说 Herb Sutter 说标准规定分配对象的自动移动是非法的。谢谢 Bames53。

于 2013-01-03T20:04:04.860 回答