我有一个疑问,因为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的内存那么为什么会这样呢?
答案 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:避免使用新的和删除外部资源管理功能