2013-03-06 53 views
0

只是想關於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; 
+3

'-1'此代碼不能編譯。顯示一些努力。 – 2013-03-06 14:27:06

+2

'shared_ptr'如果該代碼泄露將會非常無用。它不是由白癡設計的。另外,自己刪除指針導致雙重刪除的事實不會讓你知道'shared_ptr'也在做這件事嗎? – 2013-03-06 14:29:00

+0

看起來像「_foo」應該是「_pff」,反之亦然。 – 2013-03-06 14:30:17

回答

4

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

Foo目的通過obja共享指針擁有。通過執行.get(),您可以檢索到一個「啞」,觀察對指向對象的生命週期沒有任何影響的指針。在尖端對象不存在的情況下,您必須小心,不要對其進行取消引用,否則會得到「未定義行爲」。

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

沒有必要freing objb因爲當obja超出範圍時,它的析構函數將delete所擁有的對象。如果您執行了delete objb,則會通過嘗試兩次刪除對象來獲得未定義行爲。

是上述與此相同:

我想人們可以這麼說,是的。

6

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

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

1

沒有,沒有泄漏。 obja仍擁有內存,並在obja在範圍出口銷燬時被釋放。獲得指針並不等同於釋放其所有權(q.v. release())。所以你通過get()得到一個弱(非擁有)指針,只要實際所有者存在,這個指針就是有效的,但如果原始指針超過了擁有的shared_ptr,則是一個懸掛指針。

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 

你可以看一下指針的數字,當你將一個指向另一個你只要複製這個數字,沒有任何反應到該地址的內存。