effective c++ 以对象管理资源

来源:互联网 发布:欧迪臣bit one软件 编辑:程序博客网 时间:2024/05/17 22:11
void f(){    Investment *p = creatInvestment();    //.........    delete p;}

1.如果在…中有一个return
2.在…中抛出了一个异常
3.或者delete动作位于某个循环中,被continue,或者goto
就会泄漏p指向的那块资源。
为确保creatInvestment()返回的资源总是被释放掉,我们需要将资源放入对象内,当控制流离开f,该对象的析构函数会自动释放那些资源

1.获得资源后立即放进管理对象内
2.管理对象运用析构函数确保资源被释放

void f(){    auto_ptr<Investment>p(creatInvestment());    //.........}

auto_ptr被销毁时会自动删除他的所指之物,所以不要让多个auto_ptr同时指向一个对象。
一个对象被删除一次以上,那便会是未定义行为

若通过copy构造函数或者copy assignment操作符复制他们,他们就会变成null,而复制所得的指针将取得资源的唯一拥有权

auto_ptr<Investment>p(creatInvestment());auto_ptr<Investment>p2(p1);//p2指向对象,p1指向nullp = p2;//p2指向null,p1指向对象

shared_ptr是引用计数型智慧指针,持续追踪共有多少个对象指向某笔资源,并在无人指向它时自动删除资源

void f(){    shared_ptr<Investment>p(creatInvestment());    //.........}//经由shared_ptr的析构函数自动删除p

shared_ptr的复制行为就正常多了

void f(){   shared_ptr<Investment>p(creatInvestment());   shared_ptr<Investment>p2(p1);//p2,p同时指向对象   p = p2;//依旧   //.........}

auto_ptr和shared_ptr两者都在析构函数内做delete而不是delete[]动作,那意味着在动态分配而得的array身上使用auto_ptr和shared_ptr是个馊主意

0 0
原创粉丝点击