为什么unique_ptr <T> ::〜unique_ptr需要定义T?

彼得·戈德斯伯勒

如果我有一个“酒吧”课:

// bar.h
class Bar
{
public:

    Bar() { }
};

我转发声明要与另一个类“ Foo”中的std :: unique_ptr一起使用:

// foo.h
#include <memory>

class Bar;

class Foo
{

public:

    Foo();

private:

    std::unique_ptr<Bar> bar_;
};

以及我在Foo的实现文件中包含的定义:

// foo.cpp
#include "foo.h"
#include "bar.h"

Foo::Foo()
: bar_(new Bar)
{ }

我收到编译时错误“'sizeof'的无效应用到不完整的'Bar'类型”。

我从这里这里都知道要解决此问题,我可以在foo.h中声明Foo的析构函数,并将其空定义移至foo.cpp。我不明白的是,为什么要解决它。我读到了std :: unique_ptr有时需要知道其类型的完整定义。如果我必须从bar.h中包含Bar,以使unique_ptr看到其定义,这对我来说很有意义。但是Foo的析构函数与Bar的可见性有什么关系,为什么在foo.h中声明〜Foo()并在foo.cpp中定义它会导致错误静音?

Yakk-亚当·内夫罗蒙特

的析构函数unique_ptr<Bar>调用Bar::~Bar时,它delete的的Bar它拥有。所以~unique_ptr<Bar>需要看Bar::~Bar

但是模板方法仅在使用时实例化。

Fooin破坏了唯一的ptr Foo::~Foo如果~Foo住在可以看到的定义的地方~Bar,那么一切都很好。

如果您让它由编译器生成,则它将“存在”于Foo它看不到的声明中~Bar

如果向前声明它,则在之后的文件中执行Foo::~Foo() = default,它可以在称为`的点看到,并且一切都很好。Foo::~Foo() {}.cpp#include <bar.h>~Bar~std::unique_ptr<Bar>

这在实践中Bar重要,因为如何销毁取决于是否~Bar是虚拟的,是否Bar有父母以及是否~Bar是私人/受保护的,因此呼叫是非法的。

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么std :: shared_ptr <T> = std :: unique_ptr <T []>可以编译,而std :: shared_ptr <T []> = std :: unique_ptr <T []>不可以编译?

使用std :: unique_ptr <T>&代替std :: unique_ptr <T>有什么优势吗?

是否需要std :: unique_ptr <T>知道T的完整定义?

为什么可以在寄存器中传递T *,但不能传递unique_ptr <T>?

为什么std :: unique_ptr不能隐式转换为T *和const T *?

就释放而言,unique_ptr <T> :: operator =做什么

为什么unique_ptr具有nullptr_t构造函数?

使用 std::unique_ptr<T>::unique_ptr` 在 Visual Studio 2013 中构建错误

在销毁原始unique_ptr之后,由unique_ptr <T> :: get()返回的指针不是nullptr。

如何初始化std :: unique_ptr <std :: unique_ptr <T> []>?

添加从unique_ptr <T>到T *的隐式转换

来自T *的std :: unique_ptr <T>的构造函数背后的原因是什么?

调整大小std :: vector <std :: unique_ptr <T >>的性能

参数std :: unique_ptr <T> &&的std :: move或std :: forward

std :: unique_ptr <T>而不在堆上分配内存

在gcc 6中实现std :: unique_ptr <T []> :: reset

为什么我需要移动 `std::unique_ptr`

std :: unique_ptr <T []>和自定义分配器删除器

还有什么更好的替代std :: vector <std :: unique_ptr <T >>吗?

make_unique <T>()和unique_ptr <T>(new T)之间的区别

从unique_ptr <T []>初始化shared_ptr <T>

为什么unique_ptr的auto_ptr有重载?

为什么unique_ptr <Derived>隐式转换为unique_ptr <Base>?

unique_ptr 包含 unique_ptr

将std :: vector <std :: unique_ptr <T >>分配给另一个std :: vector <std :: unique_ptr <T >>

如何将vector <unique_ptr <T >>复制到独立vector <T *>

不能使用std :: unique_ptr <T>且T为前向声明

为什么我的unique_ptr立即删除自己?

为什么无法消除这种unique_ptr死存储?