2015-10-05 58 views
1

在這個例子中,我從書了「C++標準庫超越 - 介紹如何增強」:的shared_ptr和引用計數器

boost::shared_ptr<A> createA() 
{ 
boost::shared_ptr<A> p(new B()); // B is a class 
return p; 
} 
int main() 
{ 
typedef std::vector<boost::shared_ptr<A> > container_type; 
container.push_back(createA()); /* before returning p does the reference count reach 2 ? */ 
assert(container[0].use_count() == 1); // true 
} 

我想知道里面的「P」的引用計數器可以達到當我們創建共享指針「p」時,最大值爲2:1,在返回(複製)它的值之後摧毀「p」之前爲2 ...

我的問題的目標是要知道哪個選項更好,一個返回shared_ptr的函數:返回一個shared_ptr對象或一個對動態創建的shared_ptr的引用。測試此之後:

boost::shared_ptr<A>& createA() 
{ 
boost::shared_ptr<A> &p = *(new boost::shared_ptr<A>(new B)); 
assert(p.use_count() == 1); 
return p; 
} 
/* ... */ 
boost::shared_ptr<A> & tmp_ref = createA(); 
assert(tmp_ref.use_count() == 1); 
container.push_back(tmp_ref); 
assert(container[0].use_count() == 2); 

我可以說,在返回的目的是優選的,因爲在其他情況下,引用計數是2,這就是邏輯(1,因爲我們創建的shared_ptr dynamiccaly和2,因爲該載體具有複製它) 。

+0

複製elision使其很難預測。它可能會或可能不會。 –

回答

4

是的,它可能會達到2

它可以達到更高的 2,因爲我們不知道有多少份vector實現可以在內部作出它推回。它可以根據需要多次複製。

1

你的第二個例子有內存泄漏,所以你不會比較蘋果和蘋果。無論如何,增加計數器肯定會更便宜,而不是在堆上創建另一個對象。我不太明白爲什麼你非常關心參考計數器,並且如果它達到一定的價值就做出決定。你是否明白,如果計數器達到2,它不會再創建對象'A'的另一個副本?

注意:對於C++ 11,您的函數createA()應該返回std::unique_ptr,而不是std::shared_ptr,並且可以在必要時轉換爲共享。

+0

我知道,它是一個指針,如果boost :: shared_ptr是動態創建的,引用計數永遠不會達到0,所以如你所說,在main()=>內存泄漏結束後,資源永遠不會被釋放。我只想要一個函數來填充shared_ptr 的向量,最後適合的解決方案是該函數返回一個shared_ptr對象,而不是引用,我只是好奇這就是所有,我認爲返回引用更方便,但是它不是這樣的... – Aminos

+0

@Aminos你沒有看到你在第二個例子中調用new兩次嗎?它響了嗎? – Slava

相關問題