编译器是否对由new初始化的对象调用隐式析构函数

时间:2018-05-31 06:49:02

标签: c++ destructor

我有一个疑问,因为C ++(GNU g ++)编译器使用堆栈中的对象调用隐式d-tor。当它为一个对象调用d-tor时,其中内存 - 用new分配。

struct abc{
   int a;
};

int main(){
 {
     abc ob1;
 }//! Here implicit ~abc() will be called

 {
 abc *ob2 = new abc();
 } //! Will comipler call d-tor for ob2 ?

 return 0;
}

请帮助我知道,如果编译器没有释放* ob2的内存那么为什么会这样呢?

2 个答案:

答案 0 :(得分:5)

没有。您需要在对象上调用delete

如果使用C ++(非托管语言)动态创建对象,则必须在对象上调用delete以释放堆上的内存。

在指向对象的指针上调用delete将调用您要删除的对象的析构函数。

答案 1 :(得分:3)

您没有使用智能指针而您没有使用显式delete,因此ob2对象将会泄漏。

但是,如果使用智能指针,它会在离开范围时被清除:

{
    std::unique_ptr<abc> ob2( new abc() );
}

unique_ptr会致电delete所拥有的&#39; ob2离开范围时自动对象。

当然你应该使用make_unique而不是明确地调用new,这也是使用C ++ 11 auto的好地方:

{
    auto ob2 = make_unique<abc>();
}

请参阅Smart Pointers (Modern C++)

  

一般来说,在Modern C ++中,在大多数情况下,你不应该明确地调用delete。请参阅C++ Core Guidelines,特别是:

     

C.149:使用unique_ptr或shared_ptr以避免忘记删除使用新创建的对象

     

R.11:避免调用new并明确删除

     

ES.60:避免使用新的和删除外部资源管理功能