最近遇到一問題:
使用std::unique_ptr報錯:memory:error invalid application of 'sizeof' to incomplete type '***'
排查后,不使用std::unique_ptr就ok。
使用的std::unique_ptr包裝的類型是在第三方庫,看不到具體結(jié)構(gòu)和實現(xiàn),使用前置聲明來包含使用的。
糾其原因,從報錯可以看出:
std::unique_ptr
中需要靜態(tài)檢測類型的大小static_assert(sizeof(Impl)>0
,但是我們的Impl
是一個預(yù)先聲明的類型,是incomplete type
,也就沒法計算,所以導(dǎo)致報錯。std::unique_ptr
為啥需要計算這個:
std::unique_ptr
中的析構(gòu)函數(shù),
調(diào)用了默認(rèn)的刪除器default_delete
,
而default_delete
中有static_assert(sizeof(Impl)的檢查。
其實就算default_delete
中不檢查,到下一步delete __ptr;
,還是會出問題,因為不完整的類型無法被delete
。
?
解決方法:提供三種解決方法:
1:改用std::shared_ptr,或者裸指針
2:自定義刪除器,將
delete pImpl
的操作,放到*.cpp
源文件中, 此處不現(xiàn)實,沒有cpp代碼。
3:僅聲明類型***的析構(gòu)函數(shù),但不要在***.h
頭文件中實現(xiàn)它,就添加一個聲明。
?
詳細(xì)參考下面文章,
unique函數(shù)_std::unique_ptr使用incomplete type的報錯分析和解決
?
特此記錄一下。
? ??
?
本文摘自 :https://www.cnblogs.com/