c++ - delete my_object 时到底发生了什么;被执行? sizeof(MyClass) 是否将所有其他内存向左移动?

标签 c++ c memory low-level

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

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

内存现在看起来是这样的:

... 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/

相关文章:

python - 无法从使用 SWIG 创建的 python 访问 C++ 扩展模块及其方法

C 编程数组交换

c - 用C写一个JPG图片文件

c - 返回由从输入读取的行组成的字符串

memory - CUDA 中的常量内存、纹理内存和全局内存

c++ - 字符串 move 构造函数如何工作?

c++ - 在 OpenGL 中创建网格

c++ - 在 C++11 中,sqrt 定义为 constexpr?

c++ - 使用动态参数创建线程

c - Linux下硬盘满时fwrite不返回0,为什么?