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