0

shared_ptr に関して明確にしたいだけです

int main(){
   typedef std::tr1::shared_ptr<Foo> _foo;

   _foo obja(new Foo());
   Foo *objb = obja.get(); 

   // delete objb; //deleting objb will throw double free or corruption
   return 0;
}

上記のコードで、 objbが削除または解放されていない場合、メモリ リークは発生しますか? 最終的に、objaは範囲外になり、それ自体を解放します。objbobjaは同じインスタンスを指しているので、 objbを解放する必要がないということですか?

上記はこれと同じですか:

Foo *obja = new Foo();
Foo *objb;

objb = obja;
delete obja;
4

4 に答える 4

6

いいえ、漏れはありません。get生のポインターには所有権のセマンティクスがなく、生のポインターをshared_ptr参照カウントを増やすこともありません。

この例で共有ポインタが範囲外になると、指しているオブジェクトは破棄されます。既にお気づきのように、手動で削除すると、結果として未定義の動作が発生します。

于 2013-03-06T14:27:12.457 に答える
4

上記のコードで、objb が削除または解放されていない場合、メモリ リークは発生しますか?

いいえFooオブジェクトはobja共有ポインタによって所有されています。を.get()実行することで、ポイントされたオブジェクトの存続期間に影響を与えない「ダム」な観察ポインターを取得します。参照先のオブジェクトが存在しなくなった後に逆参照しないように注意する必要があります。そうしないと、未定義の動作が発生します。

objb と obja は同じインスタンスを指しているので、objb を解放する必要がないということですか?

スコープ外になると、そのデストラクタが所有するオブジェクトになるobjbため、解放する必要はありません。実行した場合、オブジェクトを 2 回削除しようとすると、未定義の動作が発生します。objadeletedelete objb

上記はこれと同じですか:

はい、そう言うことができると思います。

于 2013-03-06T14:29:10.327 に答える
1

いいえ、漏れません。 objaはまだメモリを所有しており、objaスコープの終了時に が破棄されると解放されます。ポインターを取得することは、その所有権を解放することと同じではありません ( qv release())。これget()は、実際の所有者が存在する限り有効ですが、生のポインターが所有していない場合はダングリング ポインターですshared_ptr

于 2013-03-06T14:28:43.277 に答える
0

上記のほとんどの回答は、あなたの混乱がどこにあるかを理解していないことを示していると思います。
したがって、C および C++ のポインターは単なるメモリのアドレスです。生のポインターを別のポインターに「コピー」すると、両方が同じアドレスを指すようになります。

int *ptr1 = new int(); // points to memory at address lets say 1234;
int *ptr2 = ptr1; // now also points to 1234
*ptr1 = 10; // modify int where ptr1 points to
std::cout << *ptr2 << std""endl; // print 10 as ptr2 points to the same place as ptr1
delete ptr1; // I do not need memory at address 1234 anymore
delete ptr2; // I do not need memory at address 1234 again, error double deletion

ポインターを数値として見ることができます。あるポインターを別のポインターに割り当てると、その数値をコピーするだけで、そのアドレスのメモリには何も起こりません。

于 2013-03-06T15:28:35.187 に答える