簡體   English   中英

關於shared_ptr

[英]about shared_ptr

只是想澄清有關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;

不,沒有泄漏。 原始指針沒有任何所有權語義,從shared_ptr get原始指針也不會增加引用計數。

當共享指針超出示例范圍時,指向的對象將被銷毀。 正如您已經注意到的那樣,手動刪除它會導致未定義的行為。

在上面的代碼中,如果未刪除或釋放objb,是否存在內存泄漏?

Foo對象由擁有obja共享指針。 通過執行.get() ,您將檢索“啞”,觀察指針,該指針對指向對象的生存期沒有任何影響。 您只需要注意不要在指向的對象不再存在之后取消對它的引用,否則您將獲得未定義的行為。

由於objb和obja指向同一個實例,這是否意味着不需要釋放objb?

不需要刷新objb因為當obja超出范圍時,其析構函數將delete擁有的對象。 如果確實delete objb ,則嘗試兩次刪除一個對象將獲得未定義行為。

上面是否與此相同:

我想有人可以這樣說,是的。

不,不泄漏。 obja仍然擁有該內存,並且在范圍出口處銷毀objaobja其釋放。 獲取指針並不等同於釋放其所有權(qv release() )。 因此,您會通過get()得到一個弱的(非擁有的)指針,只要實際的擁有者存在,該指針就有效,但是如果原始指針的壽命超過了所擁有的shared_ptr則該指針是懸空的。

我認為以上大多數答案都表明他們不了解您的困惑所在。
因此,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

您可以將指針看作數字,當您將一個指針分配給另一個指針時,您只需復制該數字,該地址的內存就不會發生任何變化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM