2014-02-05 22 views
14

我是新來的shared_ptr's,我試圖弄清楚.reset()函數的確切功能。在std :: shared_ptr上使用.reset()刪除所有實例

#include <memory> 
#include <stdio> 

using namespace std; 
class SomeClass{}; 

int main() 
{ 
    shared_ptr<SomeClass> sp (nullptr); 

    //do some stuff, sp now has 10 co-owners 

    cout << sp.use_count << endl; 
    sp.reset(); 
    cout << sp.use_count << endl; 
    return 0; 
} 

將輸出

10 
0 

所以,因爲我用的復位功能的所有實例從內存中刪除?如在,我只是消除任何可能的內存泄漏與SP?很顯然,這是一個玩具的例子,我很快做出來了,對不起,如果有任何錯誤。

後續情況:

shared_ptr<SomeClass> returnThis() { 
    shared_ptr<SomeClass> someObject(new SomeClass(/*default constructor for example*/)); 
    return someObject; 
} 

somehere主:

shared_ptr<SomeClass> mainObject; 
mainObject = returnThis(); 

確實mainObject有2的使用次數,因爲someObject是在一個函數創建的,但決不能清除?或者它是一個,並在返回值時自動完成清理?

+0

哎呀!如果您想要詢問後續問題,請使用頁面頂部的「問題問題」按鈕。小故事是'shared_ptr'存在自動處理所有這些東西,所以當* last *共享指針離開作用域時,該對象被銷燬。 –

回答

21

當您使用.reset()時,您正在消除一個指針的所有者,但所有其他所有者仍在。下面是一個例子:

#include <memory> 
#include <cstdio> 

class Test { public: ~Test() { std::puts("Test destroyed."); } }; 

int main() 
{ 
    std::shared_ptr<Test> p = std::make_shared<Test>(); 
    std::shared_ptr<Test> q = p; 
    std::puts("p.reset()..."); 
    p.reset(); 
    std::puts("q.reset()..."); 
    q.reset(); 
    std::puts("done"); 
    return 0; 
} 

程序輸出:

 
p.reset()... 
q.reset()... 
Test destroyed. 
done 

注意pq是對象的兩個所有者,一旦二者pq被複位,然後實例是銷燬。

+1

感謝您的回答!作爲一個後續問題,說我有一個函數返回類型是一個std :: shared_ptr但我返回的shared_ptr是在該函數內創建的,將返回shared_ptr自動遞減其use_count 1?我會在上面發佈一個後續示例。 –

1

.reset()方法僅適用於被調用的對象。

它只是取代變量持有的指針。

5

不,shared_ptr的全部目的是,如果有人在另一個地方使用它,則不能從一個地方刪除它。 sp.reset()只會將use_count減1,並將其對象替換爲nullptr

相關問題