gpt4 book ai didi

c++ - 解构具有不完整类型的对象

转载 作者:行者123 更新时间:2023-11-30 01:42:45 27 4
gpt4 key购买 nike

我已经阅读了有关该主题的其他 stackoverflow 问题,但我真的对不完整的类型和此 C++ 规范段落 §5.3.5/5 感到困惑:

If the object being deleted has incomplete class type at the point of deletion and the complete class has a non-trivial destructor or a deallocation function, the behavior is undefined.

举个例子,.h:

template<class T> class my_scoped_ptr
{
private:
T *t;
public:
my_scoped_ptr(T * _t) : t(_t) {}
~my_scoped_ptr() {
typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
(void) sizeof(type_must_be_complete);
delete t;
}
};

class Holder
{
public:
Holder();
~Holder();
private:
class Impl;
my_scoped_ptr<Impl> _mptr;
};

.cpp

class Holder::Impl {};
Holder::Holder() : _mptr(new Impl) {}
Holder::~Holder() {}

类Holder的非内联析构函数如何突然使Impl完成?为什么默认析构函数不足以使类完整?为什么shared_ptr不需要析构函数就可以完美地工作?

最佳答案

这都是关于 my_scoped_ptr<Impl>::~my_scoped_ptr 的实例化点。

当你不提供用户定义的析构函数时,默认的析构函数会在类 Holder 定义时立即定义。已处理 - 基本上,它相当于在类中定义析构函数:

class Holder {
// ...
~Holder() {}
};

此析构函数需要销毁 _mptr成员,所以~my_scoped_ptr此时也被实例化,而Impl仍然不完整。

当您在 header 中显式声明析构函数并在 .cpp 文件中定义时,~my_scoped_ptr 的实例化发生在该定义点 - 到那时,Impl已完成。

std::shared_ptr通过在运行时在其构造函数中第一次传递原始指针时捕获删除器并将其存储在控制 block 中来解决此问题。您甚至可以分配 std::shared_ptr<Derived>std::shared_ptr<Base> ,后者最终将调用正确的析构函数,即使是非虚拟的。 std::shared_ptr可以实现这个技巧,因为无论如何它都需要分配额外的存储空间(用于引用计数等),所以它已经有点重量级了。 std::unique_ptr另一方面表现出与您的 my_scoped_ptr 相同的问题,出于同样的原因。

关于c++ - 解构具有不完整类型的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39082100/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com