1. 程式人生 > 其它 >std::unique_ptr報memory: error invalid application of 'sizeof' to incomplete type

std::unique_ptr報memory: error invalid application of 'sizeof' to incomplete type

最近遇到一問題:

使用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的報錯分析和解決

特此記錄一下。