天天看点

《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成员函数用来做什么?以下是它的实现代码:

继续阅读