隐藏在auto_ptr后的思想是:用一个对象存储需要被自动释放的资源,然后依靠对象的析构函数来释放资源,这种思想不只是可以运用在指针上,还能用在其它资源的分配和释放上。 资源应该被封装在一个对象里,遵循这个规则,就能避免在存在异常环境里发生资源泄漏。但是分配和释放资源时刻的异常解决见后.
5.2
C++仅仅能删除被完全构造的对象
捕获所有的异常,然后执行一些清除代码,最后再重新抛出异常让它继续转递
在类的构造函数被调用之前数据成员就被自动地初始化它们将被自动释放
通用代码移入一个私有helper function中,让构造函数与析构函数都调用它
一个事实: 指向动态分配的对象的指针,当指针消失的时候,这些对象应该被删除,auto_ptr类就是基于这个目的而设计的。
完整设计:
class BookEntry {
public:
void addPhoneNumber(const PhoneNumber& number);
private:
string theName; // 人的姓名
string theAddress; // 他们的地址
list<PhoneNumber> thePhones; // 他的电话号码
Image *theImage; // 他们的图像
AudioClip *theAudioClip; // 他们的一段声音片段
const auto_ptr<Image> theImage; // 它们现在是
const auto_ptr<AudioClip> theAudioClip; // auto_ptr对象
};
//这样做使得BookEntry的构造函数即使在存在异常的情况下也能做到不泄漏资源,而且让我们能够使用成员初始化表来初始化theImage 和 theAudioClip,如下所示:
BookEntry::BookEntry(const string& name,
const string& address,
const string& imageFileName,
const string& audioClipFileName)
: theName(name), theAddress(address),
theImage(imageFileName != ""? new Image(imageFileName): 0),
theAudioClip(audioClipFileName != ""? new AudioClip(audioClipFileName): 0)
{}
用对应的auto_ptr对象替代指针成员变量,就可以防止构造函数在存在异常时发生资源泄漏,你也不用手工在析构函数中释放资源,并且你还能象以前使用非const指针一样使用const指针,给其赋值。
在对象构造中,处理各种抛出异常的可能,是一个棘手的问题,但是auto_ptr(或者类似于auto_ptr的类)能化繁为简。它不仅把令人不好理解的代码隐藏起来,而且使得程序在面对异常的情况下也能保持正常运行。