8

私が正しく理解していれば、shared_ptr(boost、tr1、stdなど)が新しく割り当てられたオブジェクトへのポインターで初期化されると、shared_ptrのコンストラクターは、管理するポインターの参照カウントを保持するために少量のメモリを割り当てます。その割り当てが失敗した場合はどうなりますか?次のコードでは:

class my_class {};
void my_func(shared_ptr<my_class> arg);

int main(int argc, char* argv[])
{
    my_func(shared_ptr<my_class>(new my_class()));
    return 0;
}

... my_classshared_ptrが参照カウントにメモリを割り当てられなかった場合、オブジェクトはリークされますか?または、shared_ptrのコンストラクターがオブジェクトの削除を担当しますか?

4

1 に答える 1

7

メモリを割り当てることができなくmy_classても、コードがオブジェクトをリークすることはありません。shared_ptr

C ++ 11標準(20.7.2.2.1)によると、shared_ptrコンストラクターでは次のようになります。

スロー:bad_alloc、またはメモリ以外のリソースを取得できなかった場合の実装定義の例外。

例外の安全性:例外がスローされると、deletepが呼び出されます。

ユーザー定義の削除機能を使用するコンストラクターバージョンでは、代わりに削除機能が使用されます。

Boostのドキュメントには同じことが明記されています。

于 2012-08-12T12:47:34.277 に答える