Effective C++Item 13はリソースを対象に管理します.

2987 ワード

この記事はsenlieオリジナルです.転載はこの住所を残してください.http://blog.csdn.net/zhengsenlie
経験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:シェアアップ 追跡を続けて、いくつかのオブジェクトがあるリソースを指し、誰も指していないときに自動的に削除されます.