boost::scoped_ptr
documentation包含一個被稱爲Handle/Body Idiom的技巧的例子。它是在以下的話有描述:boost :: scoped_ptr文檔不一致?
的scoped_ptr_example_test.cpp示例程序包括一個頭文件, scoped_ptr_example.hpp,其採用了scoped_ptr的<>到一個不完整的類型 到隱藏實現。
然而,在同一時間,在documentation for checked_delete
中指出:
特別麻煩的情況是,當一個智能指針的析構函數,如 的boost :: scoped_ptr的::〜scoped_ptr的,被實例化爲不完整類型。 這往往會導致沉默,難以追蹤失敗。 提供的函數和類模板可用於防止這些問題,因爲它們 需要完整類型,否則會導致編譯錯誤。
scoped_ptr
確實在其實施中使用checked_delete
。對我來說,這兩段看起來相互矛盾。另外,我無法編譯我的代碼,試圖採用建議的伎倆有以下消息:
checked_delete.hpp:32: error: invalid application of 'sizeof' to
incomplete type 'MyClass'
因此,着實的scoped_ptr
文檔erronous還是我只是錯過了什麼?
實際上,析構函數和構造函數都必須是用戶定義的。如果使用編譯器生成的默認構造函數,那麼編譯器會嘗試在'main()'中實例化'scoped_ptr',其中類型不完整。 – FireAphis
實際上,'shared_ptr'沒有這樣的問題,因爲它使用類型擦除來創建在構造函數中實例化的刪除對象。僅供參考,完全可以在類中使用'shared_ptr'來指定不完整的類型,並且只爲該類定義一個構造函數。 –
@FireAphis:構造函數不需要用戶定義。 「scope_ptr」模板的實例化並不意味着「scope_ptr」的析構函數被實例化了,只有那些被使用的方法被實例化了,我不認爲它是未定義的,因此對不完整類型使用構造函數傳遞/存儲一個指針,這對於不完整的類型是很好的) - 也就是說,假設構造函數沒有動態分配類型,而不完整類型又是一個問題。 –