コンストラクタがいくつかの例外を生成するときに役立つスマートポインタを読みました。スマートポインタとコンストラクタの例外
問題は、コンストラクタが例外生成前にいくつかのリソースを取得したが、デストラクタが呼び出されない(リソースが永続的にビジー状態になる)という問題です。
しかし、私は正しくそれをundestandすることはできません。 マイコード:
#include <memory>
#include <iostream>
class resOwner {
public:
resOwner() {
std::cout << "Map some huge resources\n";
throw "hi";
}
~resOwner() {
std::cout << "Free some huge resources\n";
}
};
class normal : resOwner {
};
int main(){
try {
std::shared_ptr<resOwner> k (new resOwner());
} catch (...) {}
}
出力がMap some huge resources
です。 どのようにスマートポインタでこのリソースリークを解決するには?
心配しないでください - http://stackoverflow.com/questions/1674980/who-deletes-the-を参照してください - C-TORがスローした場合、メモリが解放される - スマートポインタからの協力なし – PiotrNycz
リソース 'resOwner'が所有するリソースは、何らかのスマートポインタ' unique_ptr'や 'shared_ptr'などでなければなりません。そうしないと、リソースリークが発生しますデストラクタでクリーンアップを計画していたものは呼び出されません。 – Arunmu
単一のコンストラクタがコンプリート(コンストラクタデリゲーション)まで実行され、デリゲートコンストラクタがスローした場合、オブジェクトのデストラクタが呼び出されることは重要です。 – Blazo