亚洲精品亚洲人成在线观看麻豆,在线欧美视频一区,亚洲国产精品一区二区动图,色综合久久丁香婷婷

              當(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

              最近遇到一問題:

              使用std::unique_ptr報(bào)錯(cuò):memory:error invalid application of 'sizeof' to incomplete type '***'

              排查后,不使用std::unique_ptr就ok。

              使用的std::unique_ptr包裝的類型是在第三方庫(kù),看不到具體結(jié)構(gòu)和實(shí)現(xiàn),使用前置聲明來(lái)包含使用的。

              糾其原因,從報(bào)錯(cuò)可以看出:

              std::unique_ptr中需要靜態(tài)檢測(cè)類型的大小static_assert(sizeof(Impl)>0,但是我們的Impl是一個(gè)預(yù)先聲明的類型,是incomplete type,也就沒法計(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ì)出問題,因?yàn)椴煌暾念愋蜔o(wú)法被delete。

              ?

              解決方法:提供三種解決方法:

              1:改用std::shared_ptr,或者裸指針

              2:自定義刪除器,將delete pImpl的操作,放到*.cpp源文件中, 此處不現(xiàn)實(shí),沒有cpp代碼。

              3:僅聲明類型***的析構(gòu)函數(shù),但不要在***.h頭文件中實(shí)現(xiàn)它,就添加一個(gè)聲明。

              ?

              詳細(xì)參考下面文章,

              unique函數(shù)_std::unique_ptr使用incomplete type的報(bào)錯(cuò)分析和解決

              ?

              特此記錄一下。

              ? ??

              ?

              本文摘自 :https://www.cnblogs.com/

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