C++はオブジェクトで資源を管理する
2496 ワード
まず、次のコードを見てください.
このようにリソースを解放する方法は正しい.
しかし、他の人がこのコードを利用するときにdeleteの前にcontinue文やreturn文を使ってdeleteをスキップしないことを保証することはできません.そうすれば、リソースの浪費を解放することはできません.
何か方法がありますか.つまり、プログラムが終了する前に必ず自動的にリソースが解放されます.
auto_ptr(スマートポインタ):その構造関数は、その指す関数に対してdeleteを自動的に呼び出す.
もう1つの性質は、copyコンストラクション関数またはcopy assignment関数によってレプリケーション操作を行うとnullになり、レプリケーションされたポインタがリソースに対する一意の支配権を持つことです.
上記の例でauto_を軽視するptrスマートポインタの弊害は,正常な複製行為を行使できないことである.
どうしよう?下を見てください.
tr1::shared_ptr(カウント知恵ポインタを参照):auto_ptrスマートポインタの機能だけでなく、レプリケーション動作も可能です.
覚えておいてください.
1、リソースの漏洩を防止するために、RAIDオブジェクトを使用してください.これらは、コンストラクション関数中にリソースを取得し、コンストラクション関数中にリソースを解放します.
2、2つのよく使われるRAI classesはそれぞれauto_である.ptr,tr1::shared_ptr、後者のほうがいいです.
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、後者のほうがいいです.