6

APIを変更できないため、ここでshared_ptrを使用する必要があります。

Foo1 *foo1 = new Foo1(...);
shared_ptr<Foo2> foo2(foo1);

ここでshared_ptrは、foo1によって使用されるメモリの解放を処理しますか?私が正しく理解していれば、foo1でdeleteを呼び出す必要はありませんか?

4

3 に答える 3

13

はい。あなたは正しいですが、初期化する正しい方法foo2は次のとおりです。

std::shared_ptr<Foo2> foo2 = std::make_shared<Foo1>();  

std::make_shared<>()ハーブサッターは、ここ で使用する必要がある理由について説明しています: https ://herbsutter.com/2013/05/29/gotw-89-solution-smart-pointers/

于 2012-10-03T16:45:16.123 に答える
4

foo1でdeleteを呼び出さないでください。

foo1を作成しない方がよいでしょう。foo2のみ:

shared_ptr<Foo2> foo2(new Foo1(...));

std :: shared_ptrは、ポインターを介してオブジェクトの共有所有権を保持するスマートポインターです。

このポインタを共有する必要がない場合は、使用を検討してくださいstd::unique_ptr

std :: unique_ptrは、次のようなスマートポインターです。ポインターを介してオブジェクトの唯一の所有権を保持し、unique_ptrがスコープ外になると、ポイントされたオブジェクトを破棄します。

于 2012-10-03T16:44:24.177 に答える
1

正しい。スマートポインタは所有権のセマンティクスを提供します。特に、によって提供されるセマンティクスは、オブジェクトを最後に指しているオブジェクトが破棄std::shared_ptrされると、オブジェクトが削除されるというものです。参照カウント(オブジェクトを参照しているsの数)を保持し、0に達すると、オブジェクトを削除します。shared_ptrshared_ptrshared_ptr

于 2012-10-03T16:45:51.103 に答える