我之前写程序很少去考虑new了一个对象何时去delete。往往我不知道何时这个对象何时不用。
Investment* createInvestment();
void f()
{
Investment* pInv =createInvestment();
....
delete pInv;
}
看到上面我们要考虑到2种情况:
1)当...处有有个条件判断并某个条件成立时return时,这就造成了内存泄露。
2)当我们后期维护时难免会在...处修改,这也有可能造成在delete之前发生异常。
所以 “我们依靠f()总能执行delete”是不靠谱的。
解决办法
利用标准库提供的auto_ptr,auto_ptr是类指针对象,也就是我们说的“智能指针”,使用如下:
void f()
{
std::auto_ptr<Investment> pInv(createInvestment());
//一如既往的使用pInv,经由auto_ptr的析构函数自动删除pInv;
}
为了防止多个auto_ptr同时指向一个对象造成的重复删除对象,auto_ptrs有一个不同寻常的性质,若通过copy构造函数或copy assignment操作符复制它们时,它们会变成null,而复制所得指针将取得资源的唯一拥有权。
void f()
{
std::auto_ptr<Investment> pInv(createInvestment());
std::auto_ptr<Investment> pInv2(pInv); //pInv 变为Null pInv指向对象
pInv = pInv2 //pInv 指向对象 pInv2变为NULL
}
auto_ptr的替代方案是RCSP(reference -counting smart pointor) .
如下:
void f()
{
std::tr1::shared_ptr<Investment> pInv(createInvestment());
std::tr1::shared_ptr<Investment> PInv2(pInv); //PInv和PInv2同时指向一个对象。
PInv = Pinv2;
}
注意:std::auto_ptr 和 tr1::shared_ptr 只能调用delete,而不能deletep[];
原文链接: https://www.cnblogs.com/onlycxue/archive/2013/05/15/3080912.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/88608
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!