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

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

最近遇到一問(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/

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