Effective C++Item 13はリソースを対象に管理します.
2987 ワード
この記事はsenlieオリジナルです.転載はこの住所を残してください.http://blog.csdn.net/zhengsenlie
経験1:資源の漏洩を防止するために、RAIIオブジェクトを使って、それらはコンストラクションで資源を獲得し、コンストラクタで資源を解放してください.
例:f関数履行削除工場関数生成のクラス
訂正:リソースをオブジェクトに入れて、C++の「構文自動起動メカニズム」に依存して、資源が解放されることを確保する.
リソースを取得したらすぐに管理対象に入れます.
管理対象はコンストラクションを使用して、資源が解放されることを確保する.
管理対象のコンストラクションは、管理対象がスコープから離れた後に自動的に呼び出されます.
経験2:よく使われている二つのRAIIクラスはそれぞれtr 1:shared_ptrとautoptr前者は通常より良い選択です.そのcopy行為は直感的ですから.aut_を選択するとptr、コピー動作はnullを指します.
用例:std:aut_ptrと使用std:tr 1:shared_ptrの比較(コード由来:http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15361/A-TR1-Tutorial-Smart-Pointers.htm )
foo:print ap 1 pointer:0052 B 288 foo:print ap 1 pointer:0000 ap 2 point:0052 B 238
解析:atoup tr、コピー動作はnullを指します.
foo:print sp 1 pointer:006 BB 238 foo:print sp 1 pointer:006 BB 238 sp 2 pointer:006 BB 238 counter sp 1:2 counter sp 2:2
解析:
std:tr 1:シェアアップ 追跡を続けて、いくつかのオブジェクトがあるリソースを指し、誰も指していないときに自動的に削除されます.
経験1:資源の漏洩を防止するために、RAIIオブジェクトを使って、それらはコンストラクションで資源を獲得し、コンストラクタで資源を解放してください.
例:f関数履行削除工場関数生成のクラス
class Investment{ //" " root class
};
Investment *createInvestment();// , Investment 。 。
void f(){
Investment *pInv = createInvestment(); // factory
//...
delete pInv;
}
解析: f いくつかの原因のためかもしれませんが、コントロールフローはdelete文に触れられません.漏れたのは投資対象のメモリだけではなく、投資対象が保存している資源も含まれています.訂正:リソースをオブジェクトに入れて、C++の「構文自動起動メカニズム」に依存して、資源が解放されることを確保する.
class Investment{ //" " root class
};
Investment *createInvestment();// , Investment 。 。
void f(){
std::auto_ptr<Investment> pInv(createInvestment());
// factory , pInv, auto_ptr pInv
//...
}
解析:リソースを取得したらすぐに管理対象に入れます.
管理対象はコンストラクションを使用して、資源が解放されることを確保する.
管理対象のコンストラクションは、管理対象がスコープから離れた後に自動的に呼び出されます.
経験2:よく使われている二つのRAIIクラスはそれぞれtr 1:shared_ptrとautoptr前者は通常より良い選択です.そのcopy行為は直感的ですから.aut_を選択するとptr、コピー動作はnullを指します.
用例:std:aut_ptrと使用std:tr 1:shared_ptrの比較(コード由来:http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15361/A-TR1-Tutorial-Smart-Pointers.htm )
#include <memory>
#include <iostream>
class foo{
public:
void print(){std::cout << "foo::print" << std::endl;}
};
int main(){
std::auto_ptr<foo> ap1(new foo);
ap1->print();
std::cout << "ap1 pointer: " << ap1.get() << std::endl;
std::auto_ptr<foo> ap2(ap1);
ap2->print();
std::cout << "ap1 pointer: " << ap1.get() << std::endl;
std::cout << "ap2 pointer: " << ap2.get() << std::endl;
system("pause");
return 0;
}
出力:foo:print ap 1 pointer:0052 B 288 foo:print ap 1 pointer:0000 ap 2 point:0052 B 238
解析:atoup tr、コピー動作はnullを指します.
#include <memory>
#include <iostream>
class foo{
public:
void print(){std::cout << "foo::print" << std::endl;}
};
int main(){
std::tr1::shared_ptr<foo> sp1(new foo);
sp1->print();
std::cout << "sp1 pointer: " << sp1.get() << std::endl;
std::tr1::shared_ptr<foo> sp2(sp1);
sp2->print();
std::cout << "sp1 pointer: " << sp1.get() << std::endl;
std::cout << "sp2 pointer: " << sp2.get() << std::endl;
std::cout << "counter sp1: " << sp1.use_count() << std::endl;
std::cout << "counter sp2: " << sp2.use_count() << std::endl;
system("pause");
return 0;
}
出力:foo:print sp 1 pointer:006 BB 238 foo:print sp 1 pointer:006 BB 238 sp 2 pointer:006 BB 238 counter sp 1:2 counter sp 2:2
解析:
std:tr 1:シェアアップ 追跡を続けて、いくつかのオブジェクトがあるリソースを指し、誰も指していないときに自動的に削除されます.