为什么通过添加空的析构函数来修复“错误:使用unique_ptr将'sizeof'无效应用到不完整类型”的问题?

学习

我正在上课STFT在头文件中编译就可以了:

class STFT; // pimpl off to prevent point name clash

class Whatever
{
private:
    STFT* stft;

在执行中:

#include "STFT.h"
Whatever::Whatever() : stft(new STFT()) {
// blah blah
}

Whatever::~Whatever() {
    delete stft; // pure evil
}

但是,切换到std::unique_ptr<STFT> stft;标头中的原始指针并删除析构函数,我得到了

错误:将'sizeof'无效应用到不完整类型'STFT'static_assert(sizeof(_Tp)> 0,“ default_delete无法删除不完整类型”);

但是,如果我只是提供一个空的析构函数Whatever::~Whatever(){},则它可以正常编译。这让我完全难过。请填写我这个无意义的析构函数为我所做的事情。

沙菲克·雅格慕(Shafik Yaghmour)

如果我们转到cppreference文档std::unique_ptr

std::unique_ptr可以将其构造为不完整的类型T,例如,便于在Pimpl习惯用法中用作手柄。如果使用默认删除器,则T必须在调用删除器的代码中完成此操作,该操作发生在的析构函数,移动分配运算符和重置成员函数中std::unique_ptr(相反,std::shared_ptr不能从指向不完整类型的原始指针构造,但是可以在不完整类型的地方将其销毁T)。

我们可以在下面的代码中看到:

#include <memory>

class STFT; // pimpl off to prevent point name clash

class Whatever
{
    public:
     ~Whatever() ;
    private:
      std::unique_ptr<STFT> stft;
} ;

//class STFT{};

Whatever::~Whatever() {}

int main(){}

在定义STFT的析构函数之前对的定义进行注释时,无法满足Whatever要求,因为这需要stft反过来需要STFT完成的析构函数

因此,似乎在您的实现文件STFT中,当Whatever::~Whatever()被定义时是完整的,但否则默认文件被创建而没有STFT完成。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章