2012-02-06 53 views
2

在下面的例子中,當我通過p給一個函數,它就會盡快函數func退出摧毀如何在智能指針中傳遞函數?

void func(std::auto_ptr<int> p) 
{ 
    // deletes p 
} 

int main() 
{ 
    std::auto_ptr<int> p(new int); 
    func(p); 
    *p = 1; // run-time error 
} 

我還告訴記者,通過引用傳遞智能指針是一本書很糟糕的設計「C++標準庫 - Nicolai M. Josuttis的參考」。

報價:

允許一個auto_ptr按引用傳遞是非常糟糕的設計,你 應該總是避免.....

.....根據auto_ptrs的概念,可以通過使用常量引用將所有權轉移到函數中。

是不是可以傳遞智能指針或者我得到了錯誤的想法?

+2

std :: auto_ptr's由於像本書正在討論的那樣的錯誤語義而被棄用... – Lalaland 2012-02-06 05:30:46

+1

瑣碎的編輯要求:「一旦函數退出」(不是「存在」) – axon 2012-02-06 05:37:50

+0

是否有任何解釋如何通過使用常量引用可以將所有權轉移到函數中? – user1086635 2012-02-06 05:44:08

回答

7

是不是可以傳遞智能指針或者我有錯誤的想法?
它僅適用於auto_ptr。另外,根據新的C++ 11標準auto_ptr已被棄用,如果您使用的是C++ 11,unique_ptr是最好的選擇。

auto_ptr模板類確保它指向被自動銷燬在控制離開範圍,如果你在一個函數傳遞auto_ptr通過值對象,一旦功能的範圍結束對象被刪除。所以本質上你將指針的所有權轉移給函數,並且你不擁有函數調用之外的指針。

傳遞一個auto_ptr通過引用被認爲是不好的,因爲設計用於auto_ptr所有權轉讓並通過引用將其傳遞是專門設計意味着該函數可以或可以不接管通過指針的所有權。


unique_ptr情況下,如果你傳遞一個unique_ptr通過值運作那麼你轉移unique_ptr的所有權的功能。

如果你是傳遞的unique_ptr參考的功能,如果,你只是希望函數使用指針,但你做傳的所有權的功能。


shared_ptr操作上的引用計數機制,因此計數總是遞增時複製函數調用和遞減當呼叫到析構製成。

通過引用傳遞shared_ptr可以避免調用,因此可以通過引用傳遞。雖然按值適當地遞增和遞減計數,但對於大多數情況,shared_ptr的拷貝構造函數並不是很昂貴,但在某些情況下它可能很重要。因此,使用兩者中的任何一個都取決於具體情況。