建立一个Investment类,一个工场函数
class Investment{} ;
Inversment* createInvestment(); // 返回指针,指向Investment继承体系内的动态分配对象
有个函数f
调用了createInvestment
void f() {
Investment* pInv = createInvestment();
...
delete pInv;
}
,上述看起来释放了资源pInv,但是如果"…"区域内一个return
语句或者其他抛出异常都将会导致pInv资源未释放;为了确保createInvestment返回的资源总是被释放,我们需要将这些资源放进对象内,当控制流离开函数f
,该对象的析构函数会自动释放那些资源;标准程序库提供的auto_ptr
正是针对这种形势而设计的;
void f() {
std::auto_ptr<Investment> pInv(createInvestment());
// 离开作用域时,经由auto_ptr的析构函数自动删除pIn
// 注意别让多个auto_ptr指向同一个对象,不然会多次释放
}
auto_ptr
有个不寻常的性质:若通过copy构造函数或copy assigment操作符复制它们,它们会变成null,而复制所得的指针将取得资源的唯一拥有权;
std::auto_ptr<Investment> pInv1(createInvestment());
std::auto_ptr<Investment> pInv2(pInv1) //现在pInv2指向对象,pInv1被设为null,
pInv1 = pInv2 //现在pInv指向对象,pInv2被设为null