2012-08-12 8 views
8

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

答えて

7

shared_ptrがメモリを割り当てられなかった場合でも、コードはmy_classオブジェクトをリークしません。

C++ 11標準(20.7.2.2.1)によれば、shared_ptrコンストラクタで:

例外:メモリ ができなかったよりbad_alloc、または実装ドFiのNED例外リソースが他の場合得られる。

例外の安全性:例外がスローされた場合、削除pが呼び出されます。

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

Boost documentationも同じです。

+0

乾杯。私はGoogleを起動しましたが、答えは見つかりませんでした。これらの日のうちの1つでは、ソース(つまり標準)を確認する方法を学びます。 :-) – bythescruff

関連する問題