標籤:

c++primer中文版第五版中關於unique_ptr 的 release 函數的描述是不是有矛盾?

求教:

這兩句話不是矛盾的么?

而我自己寫的例子中unique_ptr管理的動態數組在執行release操作後和前面的單個動態對象一樣,並沒有調用析構函數。。這好像並不符合上面第二張圖中畫紅線的部分所述那樣?還是說我理解錯了書上的話?


你的想法是對的,書上寫錯了:up.release() 應該是 up.reset() 。

對函數的行為有疑問可以參考類似 std::unique_ptr::release - cppreference.com 的網站。

p.s. 該書的新版本似乎已經修正了這個錯誤。至少 Google Books 里的版本已經是這樣了:

C++ Primer - Google Booksbooks.google.com


一切以文檔為主。C++Primer問題很多的,畢竟是那個老頭教一幫年輕人去寫的。不過這些細節問題你都可以通過實驗和看文檔來解決。你需要從這本書學習的是C++的精神,如何寫出C++喜歡你寫的那種風格的程序,而不是把你想要的風格強行放進C++里。


第二個應該是reset吧

想到初中數學老師經常喜歡說的一句話:

不能迷信書本!要和書本比比高低!


關於智能指針的(幾乎)一切都在Effective Modern C++ 第四章,春節後上市


release是釋放所有權,reset才清理資源。書上是寫錯了。


C++primer 第五版有很多不正確或者說不準確的地方,例如

一旦給unique_ptr指定了刪除器,是不能創建空指針的,也沒有隻接受一個刪除器的構造函數,我用vs g++都試過,而網上的資料也清一色的以圖裡這個為準,但代碼演示部分乖乖使用了

unique_ptr& up(alloc(size * type), deleter)

至於提問者說的release,我自己也試過,release其實並不如其名,它不會釋放,只是將對象管理權轉讓,單獨的up.release()會使指針失效且對象無法被釋放,

auto ptr = up.release()

//ptr指向了up所管理的對象

這個特徵我記得c++ primer里說過,管理動態數組版本的unique_ptr操作應該和普通版本類似。

說的有點亂,不過提問者有這種鑽研精神很不錯。

(召喚 @vczh 輪子哥)


推薦閱讀:

如何從只會 C++ 語法的水平到達完成項目編寫軟體的水平?
關於VS2015的報錯問題,?
如何用c++寫一個簡單的計算器程序?
應該如何熟悉GNU工具鏈?例如GCC/Makefile/GDB
正在學c++但是越學越覺得自己還有好多東西不知道?

TAG:C |