获得资源后立刻放进管理对象内。
管理对象运用析构函数确保资源被释放。
/***************************auto_ptr********************************
class Investment;
void f()
{
Investment* pivs = createInvestment(); //调用工厂方法创建对象
... //当此处发生错误或提前return, goto之类的,则不会执行到delete
delete pivs; //释放对象
为确保createInvestment返回的资源总是被释放,我们需要将资源放进对象内,当控制流离开f, 该对象的析构函数会自动释放那些资源
//auto_ptr是个类指针(pointer-like)对象, 也就是所谓的智能指针,其析构函数自动对其所指对象调用delete、
//由于auto_ptr被销毁时会自动删除所指对象,所以一定要注意不要让多个auto_ptr指向同一个对象
void f()
{
std::auto_ptr<Investment> pInv(createInvestment());
...
//由auto_ptr的析构函数自动删除pInv
}
//auto_ptr有一个不同寻常的性质,若通过copying函数复制他们,它们变成null, 而复制所得的指针将拥有资源的唯一拥有权
std::auto_ptr<Investment> pInv1(createInvestment()); //pInv1指定资源
std::auto_ptr<Investment> pInv2(pInv1); //pInv1为null, pInv2指向资源
pInv1 = pInv2; //pInv2为null, pInv1指向资源
//auto_ptr并非管理动态资源的神兵利器,比如:STL容器要求其元素发挥“正常的”复制行为,因此这些容器容不得auto_ptr.
由于auto_ptr被销毁时会自动删除它所指之物,所以一定要注意别让多个auto_ptr同时指向同一对象,避免重复删除。
*******************************************************************/
/****************************shared_ptr***************************
auto_ptr的替代方案是“引用计数型智能指针”( Reference-counting smart pointer RCSP )
RCSP类似与垃圾回收,但是无法打破环状引用(cycles of references),例如两个不在被使用的对象互相指
tr1的tr1::shared_ptr就是一个RCSP
void f()
{
...
std::tr1::shared_ptr<Investment> pInv(createInvestment());
...
//由shared_ptr析构函数自动删除
}
void f()
{
...
std::trl::shared_ptr<Investment> pInvl(createInvestment());
std::trl::shared_ptr<Insvestment> pInvl2(pInvl); //pInvl和pInvl2指向同一个对象
pInvl = pInv2; //同上
... //pInvl和pInvl2被销毁,所指对象才被销毁
}
*******************************************************************/