當(dāng)前位置:首頁 > IT技術(shù) > 移動平臺 > 正文

std::unique_ptr報memory: error invalid application of 'sizeof' to incomplete type
2022-05-11 10:55:46

最近遇到一問題:

使用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/

開通會員,享受整站包年服務(wù)立即開通 >