2012-02-20 45 views
8

的「所有權,源和匯」這site狀態:這兩個關於'auto_ptr`模板類的來源是否存在矛盾?

「當你複製一個auto_ptr,您將自動從源auto_ptr所有權轉讓給目標auto_ptr; 如果目標auto_ptr已經擁有的對象,該對象首先被釋放。複製後,只有目標auto_ptr擁有該指針,並將在適當的時候將其刪除,而源被設置爲空狀態,並且不能再用於引用擁有的對象。 」。

現在考慮爲templacte<classX> class auto_ptr中的operator=()定義,在第14章,Stroustrup的的C++編程語言第三版的368頁:

auto_ptr& operator=(auto_ptr& a) throw() { ptr = a.ptr; a.ptr = 0; }

我看不到操作釋放對象由ptr尋址,以防ptr != 0

+2

其他可疑:「operator =」沒有返回任何東西。 – Mat 2012-02-20 12:06:50

+0

@sbi C++編程語言第三版 – Belloc 2012-02-20 12:07:57

+0

'ptr'的類型是什麼?那是'classX *'還是'auto_ptr_guts '?如果是後者,上面的代碼將是相當微不足道的。 – MSalters 2012-02-20 12:20:31

回答

4

是的,這絕對是後一段代碼中的一個錯誤。在爲ptr分配新值之前,由ptr指向的對象必須爲delete d,否則ptr最初指向的對象將被泄漏。

+0

奇怪的是,即使在勘誤(http://www2.research.att.com/~bs/3rd_printing5.html)中也沒有提及刪除。 – Belloc 2012-02-20 12:14:23

+0

@ user1042389:多年來,一些錯誤在代碼庫中。 – sharptooth 2012-02-20 12:15:18

+1

@sharptooth:尤其是未使用的代碼庫 - 它並不像在C++ PL中的代碼自動從'auto_ptr'的生產實現的存儲庫中提取。 – 2012-02-20 12:30:17