为 什么有时对象退出作用域时没有调用析构函数?

正常情况下退出作用域时都会调用析构函数,不过有时也会有这种问题,先看下例子:

也就是说,有些人误以为 new 创建的对象会在函数的最后被析构。

基本上,只有当你希望一个对象能“生存”于其被创建的域之外时,才应该使用“ new”。如果这样,你就需要使用“delete”来析构该对象。例如:

如果你希望一个对象只能“生存”于一个域中,那就不要使用“new”,而应该单纯地定义一个变量:

{
ClassName x;
// use x
}

变量在退出作用域时会被隐式析构。

在同一个域中使用 new 创建对象,然后使用 delete 来将之析构不但难看,而且容易出错,更是效率低下。例如: