gpt4 book ai didi

c++ - 调用析构函数或调用 `delete` 时是否释放内存?

转载 作者:IT老高 更新时间:2023-10-28 22:23:34 28 4
gpt4 key购买 nike

假设你有一个 class Fool 的对象。

class Fool
{
int a,b,c;
double* array ;
//...
~Fool()
{
// destroys the array..
delete[] array ;
}
};


Fool *fool = new Fool() ;

现在,I know you shouldn't ,但是有些傻瓜无论如何都会在 fool 上调用析构函数。 傻瓜->~Fool();.

这是否意味着 fool 的内存已被释放,(即 a、b、c 无效) 是否仅表示 ~Fool 中的任何释放() 函数发生(即只删除数组?)

所以我想我的问题是,析构函数只是另一个函数,它在对象上调用 delete 时被调用,还是做更多的事情?

最佳答案

如果你写

fool->~Fool();

你结束了对象的生命周期,它调用析构函数并回收内部 array 数组。然而,保存对象的内存并没有被释放,这意味着如果你想使用placement new 使对象恢复活力:

new (fool) Fool;

你可以这样做。

根据规范,在显式调用析构函数后读取或写入 fool 字段的值会导致未定义的行为,因为对象的生命周期已经结束,但保存对象的内存应该仍然被分配,你需要通过调用 operator delete 来释放它:

fool->~Fool();
operator delete(fool);

使用operator delete而不是仅仅写的原因

delete fool;

是后者有未定义的行为,因为fool的生​​命周期已经结束。使用原始释放例程 operator delete 可确保回收内存,而无需尝试执行任何操作来结束对象的生命周期。

当然,如果对象的内存不是来自 new(可能是堆栈分配的,或者您使用的是自定义分配器),那么您不应该使用 operator delete 释放它。如果你这样做了,你最终会得到未定义的行为(再次!)。这似乎是这个问题中反复出现的主题。 :-)

希望这会有所帮助!

关于c++ - 调用析构函数或调用 `delete` 时是否释放内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7155330/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com