为了这个问题,我将把内存想象成一个简单的字节数组,我将讨论堆内存,因为它可以动态分配。
假设我正在实例化某个类,并在已经分配了一些内存的堆上创建一个对象。然后,在创建对象之后,我分配了更多的内存(可能通过实例化另一个类)。当然,这意味着使用 new
和 delete
关键字。
内存现在看起来是这样的:
... byte byte my_object ... my_object byte byte ...
执行 delete my_object;
时到底发生了什么? sizeof(MyClass)
是否将所有其他内存向左移动?如果有,由谁负责?操作系统?那么当没有操作系统提供虚拟内存时会发生什么?
最佳答案
不,没有任何变化。相反,内存获取 fragmented ,这意味着您现在在已用内存中间有一个未使用的空洞。后续分配可能能够重新使用部分或全部内存(前提是请求的字节数足够小以适合空洞)。
一些语言/环境支持压缩垃圾收集器。这样的收藏家被允许四处移动物体,因此如果他们愿意,可以消除洞。这种方法实现起来很复杂,因为收集器需要知道程序中每个指针的位置。因此,这种类型的收集器更适合高级语言。
关于c++ - delete my_object 时到底发生了什么;被执行? sizeof(MyClass) 是否将所有其他内存向左移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14146298/