最简单的答案是“肯定会调用!”,不过还是先来看看一个经常伴随着这个问题的例子吧:
void f()
{
X* p = new X;
// use p
}
也就是说,有些人误以为 new 创建的对象会在函数的最后被析构。
基本上,只有当你希望一个对象能“生存”于其被创建的域之外时,才应该使用“new”。若然如此,你就需要使用“delete”来析构该对象。例如:
X* g(int i) { /* ... */ return new X(i); } // the X outlives the call of g()
void h(int i)
{
X* p = g(i);
// ...
delete p;
}
如果你希望一个对象只能“生存”于一个域中,那就不要使用“new”,而应该单纯地定义一个变量:
{
ClassName x;
// use x
}
变量在退出作用域时会被隐式析构。
在同一个域中使用 new 创建对象,然后使用 delete 来将之析构不但难看,而且容易出错,更是效率低下。例如:
void fct() // ugly, error-prone, and inefficient
{
X* p = new X;
// use p
delete p;
}
原文地址:http://www.research.att.com/~bs/bs_faq2.html#delete-scope
本文版权归 蚂蚁的 C/C++ 标准编程 以及 作者 Bjarne Stroustrup 翻译:antigloss 共同所有,转载请注明原作者和出处。谢谢。