- 93 名前:91 mailto:sage [2009/05/07(木) 01:02:48 ]
- >>92は俺に言ってる?
例えばスマートポインタを使う場合が最も分かりやすい。 次のようなクラス MyClass があったとする。 class MyClass { public: MyClass(); ~MyClass(); private: MyAnotherClass* p; }; で、MyClass::MyClass() の内部で p = new MyAnotherClass(); などとして、 MyClass::~MyClass() で delete p; しているとする。この場合、MyClass::MyClass() が迂闊に例外を スローすると、MyClass::~MyClass() が実行されないためにpが解放されない場合があるから、 例外をスローする場合はpの解放がきちんとされるように、注意深くコードを書かなければならない。 ただし、メンバ変数 p をポインタではなくスマートポインタとすると、そのような注意は不要となる。 例えば std::auto_ptr<MyAnotherClass> p; となっていて、MyClass::MyClass() の内部で p(new MyAnotherClass()); とした場合、たとえMyClass::MyClass()が例外をスローしても newされたものはちゃんと解放されるから、神経質にならなくて済む。 忘れてはならないのは、スマートポインタのコンストラクタが迂闊に例外をスローしてしまうと、 結局、リソースリークの可能性は消えないということだ。まあ自分でスマートポインタを書いて使うことは 普通の人はないと思うけど、実際 boost::shared_ptr 等はコンストラクタで例外を投げる場合があり、 その場合でもリソースリークが起こらないようにちゃんと配慮されている。
|

|