C++はオブジェクトで資源を管理する

2496 ワード

まず、次のコードを見てください.
class Node {};



Node* CreateNode()

{

    

}



void Solve()

{

    Node *p=CreateNode();  //  CreateNode  

    ...

    delete p;         //    

}

このようにリソースを解放する方法は正しい.
しかし、他の人がこのコードを利用するときにdeleteの前にcontinue文やreturn文を使ってdeleteをスキップしないことを保証することはできません.そうすれば、リソースの浪費を解放することはできません.
何か方法がありますか.つまり、プログラムが終了する前に必ず自動的にリソースが解放されます.
auto_ptr(スマートポインタ):その構造関数は、その指す関数に対してdeleteを自動的に呼び出す.
void Solve()

{

    std::auto_prt<Node>p(CreateNode());

    ...                    ///  auto_ptr        p  

}

 
もう1つの性質は、copyコンストラクション関数またはcopy assignment関数によってレプリケーション操作を行うとnullになり、レプリケーションされたポインタがリソースに対する一意の支配権を持つことです.
void Solve()

{

    std::auto_prt<Node>p1(CreateNode());

    std::auto_prt<Node>p2(p1);  //p2    ,p1 null

    p1=p2;                      //p1    ,p2 null

}

 
上記の例でauto_を軽視するptrスマートポインタの弊害は,正常な複製行為を行使できないことである.
どうしよう?下を見てください.
tr1::shared_ptr(カウント知恵ポインタを参照):auto_ptrスマートポインタの機能だけでなく、レプリケーション動作も可能です.
void Solve()

{

    std::tr1::shared_ptr<Node>p1(CreateNode());

    std::tr1::shared_ptr<Node>p2(p1);  //p1 p2      

    p1=p2;           //p1 p2      

    ...             //p1,p2     ,             

}

 
覚えておいてください.
1、リソースの漏洩を防止するために、RAIDオブジェクトを使用してください.これらは、コンストラクション関数中にリソースを取得し、コンストラクション関数中にリソースを解放します.
2、2つのよく使われるRAI classesはそれぞれauto_である.ptr,tr1::shared_ptr、後者のほうがいいです.