- 作為成員函數(shù)的一種,用于在對象消亡時做一些釋放空間的善后工作。
- 與構(gòu)造函數(shù)對應(yīng),但是一個類只有一個。
- 名字與類名相同,在前面加“~”。
- 缺省的析構(gòu)函數(shù)不涉及釋放用戶申請的內(nèi)存釋放等清理工作
對象數(shù)組的每個元素的析構(gòu)函數(shù)都會被調(diào)用
class Ctest {
public:
~Ctest() { cout<< "destructor called" << endl; }
};
int main () {
Ctest array[2];
cout << "End Main" << endl;
return 0;
}
輸出:
End Main
destructor called
destructor called
delete 運算導致析構(gòu)函數(shù)調(diào)用
Ctest * pTest;
pTest = new Ctest; //構(gòu)造函數(shù)調(diào)用
delete pTest; //析構(gòu)函數(shù)調(diào)用
------------------------------------------------------------------
pTest = new Ctest[3]; //構(gòu)造函數(shù)調(diào)用3次
delete [] pTest; //析構(gòu)函數(shù)調(diào)用3次
析構(gòu)函數(shù)調(diào)用時機的問題
class Demo {
int id;
public:
Demo( int i )
{
id = i;
cout << “id=” << id << “ Constructed” << endl;
}
~Demo()
{
cout << “id=” << id << “ Destructed” << endl;
}
};
Demo d1(1);
void Func(){
static Demo d2(2);
Demo d3(3);
cout << “Func” << endl;
}
int main (){
Demo d4(4);
d4 = 6;
cout << “main” << endl;
{
Demo d5(5);
}
Func();
cout << “main ends” << endl;
return 0;
}
輸出:
id=1 Constructed
id=4 Constructed
id=6 Constructed
id=6 Destructed
main
id=5 Constructed
id=5 Destructed
id=2 Constructed
id=3 Constructed
Func
id=3 Destructed
main ends
id=6 Destructed
id=2 Destructed
id=1 Destructed
"{}" 表示在其作用域內(nèi)調(diào)用,出了作用域就“消亡”
static 靜態(tài)變量消亡在程序結(jié)束時。
最后是我在碰見的一個問題
int main()
{
A *p = new A[2];
A *p2 = new A;
A a;
delete p;
}
//問:析構(gòu)函數(shù)調(diào)用了幾次?
答案是 3
因為new出來的對象,需要程序員自己delete,析構(gòu)函數(shù)不被調(diào)用