Leehm

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

最近遇到一问题:

使用std::unique_ptr报错:memory:error invalid application of 'sizeof' to incomplete type '***'

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

使用的std::unique_ptr包装的类型是在第三方库,看不到具体结构和实现,使用前置声明来包含使用的。

纠其原因,从报错可以看出:

std::unique_ptr中需要静态检测类型的大小static_assert(sizeof(Impl)>0,但是我们的Impl是一个预先声明的类型,是incomplete type,也就没法计算,所以导致报错。std::unique_ptr为啥需要计算这个:

std::unique_ptr中的析构函数,

调用了默认的删除器default_delete

default_delete中有static_assert(sizeof(Impl)的检查。

其实就算default_delete中不检查,到下一步delete __ptr;,还是会出问题,因为不完整的类型无法被delete

 

解决方法:提供三种解决方法:

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

2:自定义删除器,将delete pImpl的操作,放到*.cpp源文件中, 此处不现实,没有cpp代码。

3:仅声明类型***的析构函数,但不要在***.h头文件中实现它,就添加一个声明。

 

详细参考下面文章,

unique函数_std::unique_ptr使用incomplete type的报错分析和解决

 

特此记录一下。

    

 

posted on 2022-05-11 10:03  Leehm  阅读(1769)  评论(0编辑  收藏  举报