一般而言,构造函数和析构函数的安全都如你预期:
{
Point point;
// point.Point::Point(); //一般安插在这里
// point::Point::~Point(); //一般安插在这里
}
如果一个作用域({}
括起来的区域)或者函数有一个以上的离开点:析构函数必须被放在每一个离开点(当前object还存活),比如:
{
Point point;
// constructor安插在这里
switch((int)(point.x())){
case -1:
// destructor安插在这里
return;
case 0:
// destructor安插在这里
return;
case 1:
// destructor安插在这里
default:
// destructor安插在这里
return;
}
// destructor安插在这里
}
上面,point的destructor必须在switch指令四个出口的return操作前被生成出来。另外也有可能在这个区段的结束符号(右大括号)之前被生成出来---- 即使程序分析的结果发现绝不会进行到那里。
同样,goto指令也可能需要很多个destructor调用操作,比如:
{
if(cache)
return 1;
Point xx;
// constructor安插在这里
while(cvs.iter(xx))
if(xx == value)
goto found
// destructor安插在这里
return 0;
found:
// destructor安插在这里
return 1;
}
析构函数的调用操作必须放在最后两个return指令之前,但是却不必被放在第一个return之前,因为那时object还没有生成。
一般来说我们会把object尽可能的放在使用它的那个程序区段附近,这样做可以节省很多不必要的对象产生操作和销毁操作。