析構(gòu)函數(shù)

  • 作為成員函數(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 運(yùn)算導(dǎo)致析構(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)用時機(jī)的問題

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
因?yàn)閚ew出來的對象,需要程序員自己delete,析構(gòu)函數(shù)不被調(diào)用

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容