std::unique_ptr報memory: error invalid application of 'sizeof' to incomplete type
阿新 • • 發佈:2022-05-11
最近遇到一問題:
使用std::unique_ptr報錯:memory:error invalid application of 'sizeof' to incomplete type '***'
排查後,不使用std::unique_ptr就ok。
使用的std::unique_ptr包裝的型別是在第三方庫,看不到具體結構和實現,使用前置宣告來包含使用的。
糾其原因,從報錯可以看出:
std::unique_ptr
中需要靜態檢測型別的大小static_assert(sizeof(Impl)>0
,但是我們的Impl
是一個預先宣告的型別,是incomplete type
,也就沒法計算,所以導致報錯。std::unique_ptr
std::unique_ptr
中的解構函式,
呼叫了預設的刪除器default_delete
,
而default_delete
中有static_assert(sizeof(Impl)的檢查。
其實就算default_delete
中不檢查,到下一步delete __ptr;
,還是會出問題,因為不完整的型別無法被delete
。
解決方法:提供三種解決方法:
1:改用std::shared_ptr,或者裸指標
2:自定義刪除器,將
delete pImpl
的操作,放到*.cpp
原始檔中, 此處不現實,沒有cpp程式碼。
3:僅宣告型別***的解構函式,但不要在***.h
標頭檔案中實現它,就新增一個宣告。
詳細參考下面文章,
unique函式_std::unique_ptr使用incomplete type的報錯分析和解決
特此記錄一下。