以对象管理资源
假设我们用一个程序库来模拟投资, 各样的投资类型都继承于一个root class:
class Investment
{
...
}
这个程序库通过一个工厂函数来返回特定的对象:
Investment* createInvestment();
当我们使用这个返回对象之后, 需要删除他,设计个函数f来做这个事:
void f()
{
Investment* pInv = createInvestment();
...
delete pInv;
}
这个函数其实并不能保证最后一定会delete掉pInv, 因为中间的函数部分可能会直接return,或者抛出异常, 最后的delete语句就不一定会被执行。
许多类似的资源都被动态分配在heap上之后, 被用于单一区块或者函数内, 他们应该在离开那个区块或者函数时被释放,我们可以用智能指针来管理这个资源:
void f()
{
std::auto_ptr<Investment> pInv(createInvestment());
...
}
这样,无论控制流如何离开区块,一旦对象被销毁, 析构函数自动会被调用,于是资源被释放。
auto_ptr会自动删除他所指向之物,所以我们要注意不能让多个auto_ptr指向同一个对象,否则一个对象会被多次删除,
std::auto_ptr<Investment> pInv(createInvestment());
std::auto_ptr<Investment> pInv2(pInv1); //pInv1 被设置为null
pInv1 = pInv2; //pInv2 被设置为null
收到auto_ptr管理的对象只能有一个auto_ptr指向。
对于多个指针指向同一个对象, 我们可以用shared_ptr
void f()
{
std::tr1::shared_ptr<Investment> pInv(createInvestment());
...
}
void f()
{
std::tr1::shared_ptr<Investment> pInv(createInvestment());
std::tr1::shared_ptr<Investment> pInv2(pInv1);
pInv1 = pInv2;
}
这样两个指针都同时指向同一个对象。