18

私はソフトウェア開発に取り組んでstd::shared_ptrおり、ソフトウェア開発中に、メモリ管理について疑問を抱かせるいくつかのケースに遭遇しました。私はサードパーティのライブラリを持っていて、関数からの生のポインタを常に提供していて、コードでそれらを変換していましたstd::shared_ptr(boostからではなくstdから。ところで、2つの違いは何ですか?)。それで、私が次のコードを持っているとしましょう:

ClassA* raw = new ClassA;
std::shared_ptr<ClassA> shared(raw);

共有ポインターがスコープ外になるとどうなりますか(関数内でローカルに宣言され、関数を終了するとします)。ClassA生のポインタがオブジェクトを指しているので、オブジェクトはまだ存在しますか?

4

3 に答える 3

29

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

于 2012-09-14T12:58:48.950 に答える
5

番号。共有ポインタはそれを削除します。

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

ライブラリは提供するオブジェクトを破棄する方法を提供していますか? その場合、その関数を使用して破棄する必要があります。

于 2012-09-14T13:01:26.337 に答える
2

いいえ、ClassAオブジェクトは破棄されます。スコープ外のどこかにコピーしていない限りshared_ptr、その参照カウンターは > 1 です。

于 2012-09-14T13:00:03.977 に答える