C ++析构函数:当内存被释放时?

时间:2011-01-25 11:35:16

标签: c++ destructor

如果我删除了一个导致其析构函数被调用的对象,那么在析构函数完成函数之前或之后是否释放了内存?

6 个答案:

答案 0 :(得分:7)

只有在最小派生类子对象被销毁后才会释放内存。所以如果你有:

class Base {
};

class Derived : public Base {
public:
    ~Derived();
};

然后第一个Derived被销毁,然后Base被销毁,只有内存被解除分配。

答案 1 :(得分:3)

delete分解为它实际执行的操作,并且查看内存何时被删除是相对清楚的。所以这样的声明:

delete some_ptr;

大致相当于这个伪代码:

some_ptr->~some_ptr();
free( some_ptr );

因此在调用析构函数后释放内存。析构函数的确切行为不是由delete运算符决定的,而是由类的定义决定的。通常它会进行局部清理并确保也调用它的基类析构函数。

重要的是要意识到释放内存实际上并不是析构函数的一部分。它是释放内存的delete运算符。


请注意,伪代码中的free函数实际上是operator delete()函数之一,对于已删除的类或全局函数。这实际上释放了记忆。

答案 2 :(得分:2)

析构函数完成后,内存将被释放。否则,访问析构函数内的成员变量会导致段错误。

答案 3 :(得分:2)

析构函数后调用

operator delete,但释放内存时使用的是allocator

答案 4 :(得分:0)

我认为在析构函数本身完成执行后释放内存。我知道当捕获异常时,在对象本身超出范围之前不会调用对象的析构函数。

答案 5 :(得分:0)

在C ++中,破坏是指使用对象中可用的数据执行某些代码。这段代码是任意的。

释放内存是一种低级别的处理,一般由delete运算符隐藏,在调用析构函数之前永远不应该调用。

最好由Allocator界面总结:

  • allocatedeallocate用于操作原始内存
  • constructdestroy用于调用对象的构造函数和析构函数

预先确定constructdestroydeallocate只应在先前由该分配器分配的内存上执行。它还会使destroy不会释放内存,并且必须随后调用deallocate

请注意,这是一个低级接口,它允许销毁一个对象并重用释放的空间来构建另一个对象。