最近遇到一问题:
使用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的报错分析和解决
特此记录一下。