天天看點

《C++面向對象高效程式設計(第2版)》——4.3 C++中的無用單元收集

本節書摘來自異步社群出版社《c++面向對象高效程式設計(第2版)》一書中的第4章,第4.3節,作者: 【美】kayshav dattatri,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

c++面向對象高效程式設計(第2版)

c++提供類的析構函數專門處理無用單元收集,但是,這并不意味着無用單元收集隻發生在析構函數中。實際上,某些其他成員函數也必須考慮無用單元收集。

類的析構函數給予對象最後一次機會釋放它所獲得的所有資源。在退出某作用域之前,由語言自動為在該作用域中建立的自動(基于棧)對象調用析構函數。此時,對象即将被銷毀(也就是說,被對象占用的記憶體即将被系統回收)。一旦析構函數完成,對象将徹底地消失。

删除(使用delete操作符)指向某對象的指針時,将通過該對象調用對象所屬類的析構函數。

// 第一個構造函數

tperson::tperson(const char birthdate[])

    : _ssn(0), _name(0), _birthdate(birthdate), _address(0)

    { / 構造函數體無代碼 / }

char strdup (const char src)  // 輔助函數

{

  char* ptr = new char[strlen(src)+1];

  strcpy(ptr, src);  

  return ptr;

}

// 第二個構造函數

tperson::tperson(const char thename[], const char theaddress[],

     unsigned long thessn, const char thebirthdate[])

   : _ssn(thessn), _birthdate(thebirthdate)

{ // 初始化_name、_address等

  _name = (thename ? strdup(thename) : 0);

  _address = (theaddress ? strdup(theaddress) : 0);

}<code>`</code>

我們已在堆(heap)上為待儲存人名中的字元配置設定記憶體。析構函數負責釋放這些記憶體。

main()

    tperson john(“11-23-45”);

    // ...

    john.setname(“john wayne”);

對象john隻有出生日期,沒有姓名。接下來,我們使用setname成員函數設定john的姓名。setname成員函數用來做什麼?以下是它的實作代碼:

繼續閱讀