Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除my_对象时会发生什么情况;被处决了?所有其他内存是否都被sizeof(MyClass)向左移动?_C++_C_Memory_Low Level - Fatal编程技术网

C++ 删除my_对象时会发生什么情况;被处决了?所有其他内存是否都被sizeof(MyClass)向左移动?

C++ 删除my_对象时会发生什么情况;被处决了?所有其他内存是否都被sizeof(MyClass)向左移动?,c++,c,memory,low-level,C++,C,Memory,Low Level,为了解决这个问题,我将把内存描述为一个简单的字节数组,我将讨论堆内存,因为可以动态分配它 假设我正在实例化某个类,并在已经分配了一些内存的堆上创建一个对象。然后,在创建对象之后,我分配更多的内存(可能通过实例化另一个类)。当然,这意味着要使用new和delete关键字 内存现在如下所示: 。。。字节字节我的_对象。。。我的对象字节… 当删除我的_对象时会发生什么是否执行?是否所有其他内存都向左移动了sizeof(MyClass)?如果是,由谁负责?操作系统?那么,当没有操作系统提供虚拟内存时会发

为了解决这个问题,我将把内存描述为一个简单的字节数组,我将讨论堆内存,因为可以动态分配它

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

内存现在如下所示:

。。。字节字节我的_对象。。。我的对象字节…


删除我的_对象时会发生什么是否执行?是否所有其他内存都向左移动了
sizeof(MyClass)
?如果是,由谁负责?操作系统?那么,当没有操作系统提供虚拟内存时会发生什么情况呢?

不,没有任何内容会被移动。取而代之的是内存,这意味着你现在在使用内存的中间有一个未使用的洞。随后的分配可能能够重用部分或全部内存(前提是请求的字节数足够小,可以放入该孔中)


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

如果内存被移动,在我看来,这将是一个非常糟糕的操作系统。通常情况下,操作系统会被通知该内存可重复使用。它甚至不需要被清除(大多数情况下都不需要)。当无法分配更多内存时,通常会出现异常(如果使用
new
)或空指针返回(如果使用
malloc

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

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


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

内存不会向左移动。想象一下如果是这样会发生什么。所有的指针“右边”都会失效。< /P>感谢编辑罗伯特,现在更清楚了。在C++中不允许压缩(或其他移动)垃圾收集器。C++规范要求指针值稳定。例如,如果使用某种技巧来隐藏指针,以便垃圾收集器不会弄乱它,那么在检索原始指针值时,它仍必须指向原始对象。