2012-09-14 10 views
16

私はstd::shared_ptrで作業しています。私のソフトウェア開発では、私はメモリ管理について疑問に思っているカップル に会いました。私は が私に関数からの生ポインタを与えたサードパーティのライブラリを持っていました。私は をstd::shared_ptrに変換していました。(これはstdでブーストではありません。C++の未処理ポインタとstd :: shared_ptr

共有ポインタがスコープの外に出たとき、今何が起こる
ClassA* raw = new ClassA; 
std::shared_ptr<ClassA> shared(raw); 

(のは、それが機能 内でローカルに宣言されたとしましょう、今、私は機能を終了しています):それでは、私は次のコードを持っているとしましょう。 が指し示しているので、ClassAオブジェクトはまだ存在しますか?

答えて

27

いいえ、それはできません。 shared_ptrにポインタを与えることで、shared_ptrにはそれを削除する責任が与えられます。それを参照する最後のshared_ptrオブジェクトが存在しなくなったときにこれを行います。生ポインタはカウントされません。

+1

理由:なぜshared_ptrは、shared_ptrがそれについて知る方法がないので、生ポインタを考慮しません。あなた自身がshared_ptrをどのように実装するのか考えてみると、データへの生ポインタがあるかどうかを検出できないことがわかります。 – Wutz

+1

+1。また、これは 'shared_ptr'を作成するときと同じ行にオブジェクトを' new'する必要があるからです。さらに、['make_shared'](http://en.cppreference.com/w/cpp/memory/shared_ptr/make_shared) –

+0

を使用してください。実のところ、未処理のポインタがあるかどうかを調べる方法がないことに同意しますオブジェクトを指しています。この場合、生ポインタは2番目のshared_ptrに渡した場合、最初のshared_ptrはまだinceaseになりますか? – ISTB

2

いいえ、ClassAオブジェクトは破壊されます。有効範囲外のshared_ptrをコピーしていない場合を除いて、その参照カウンタは> 1です。

5

いいえ。共有ポインタがそれを削除します。

ポインタを提供するサードパーティのライブラリをお持ちの場合は、正しい方法で削除する必要があります。たとえば、第三者のlibに 'malloc'を割り当てた場合、libが使用する 'free'の実装を使用する必要があります。どのように割り当てられたかを確認する必要があります。

あなたが提供するオブジェクトを破壊する手段を提供していますか?その場合は、その関数を使用して破壊する必要があります。

関連する問題