std :: unique_ptr的自定义删除程序是否是手动调用析构函数的有效位置?

d7武士

我有一个非常基本的反射实现,其中包括一个Type类,该类对其所描述的类进行对象实例化。分解为相关部分,看起来像这样:

Type.h:

class Plugin; // forward declaration

typedef std::unique_ptr<Plugin> PluginPtr;

namespace Reflection {

    class Type {
    public:
        explicit Type(PluginPtr(*)());
        PluginPtr CreateInstance();
    private:
        PluginPtr(*_createInstance_Handler)();
    };

}

Type.cpp:

Type::Type(PluginPtr(*createInstance_Handler)()) :
    _createInstance_Handler(createInstance_Handler) {}

PluginPtr CreateInstance() { return (*_createInstance_Handler)(); }

实际的实例化逻辑位于Plugin类中(及其每个子类中):

Plugin.h:

class Plugin {
public:
    virtual ~Plugin();
    static const Reflection::Type Type;
private:
    static PluginPtr CreateInstance();

插件.cpp

Plugin::~Plugin() {}

const Reflection::Type Plugin::Type(CreateInstance);

PluginPtr Plugin::CreateInstance() { return PluginPtr(new Plugin); }

当我尝试对此进行编译时,出现以下错误(在Visual Studio 2013中):

error C2027: use of undefined type 'Plugin'
error C2338: can't delete an incomplete type
warning C4150: deletion of pointer to incomplete type 'Plugin'; no destructor called

我仔细研究了一下,显然这是由std :: unique_ptr的删除器引起的(在正在操作的类的类定义中发现自己)。我在某处读到,如果我提供自己的删除器,此问题将消失。所以我重新定义PluginPtr为:

typedef std::unique_ptr<Plugin, PluginDeleter> PluginPtr

(编译)问题确实消失了,但是问题是,是否可以/应该手动进行PluginDeleter调用~Plugin()(以确保正确地破坏了插件(以及PluginPtr可能指向的任何派生对象!))?还有我应该在哪里/如何最好地声明/定义它,以免出现类型不完整的问题?

(或者是否有更好的方法?)

PS。现在,在处理我的源代码时,我意识到上面的代码有错误。Type.cpp的最后一行应显示为

    PluginPtr CreateInstance() { return (_createInstance_Handler)(); }
杰弗罗伊

的Deleterstd::unique_ptr应该删除该对象,也就是说销毁它(如您可以假设的那样),然后在需要时释放所使用的内存。

如果您的自定义删除程序使用delete运算符,那么您不必手动调用析构函数为:

delete是一个具有非常特定行为的运算符:使用delete运算符的表达式,首先调用适当的析构函数(针对类类型),然后调用函数运算符delete(即此函数)以释放存储。

如果使用静态分配的内存或在静态分配的内存中的新放置指针创建的指针,或者在应用程序退出之前不会释放的内存(例如),则不应调用delete运算符,但仍然必须销毁该指针。对象,因此您必须调用对象的析构函数。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带有lambda自定义删除程序的std :: unique_ptr无法编译

来自分类Dev

自定义删除程序以通过std :: unique_ptr释放2D数组

来自分类Dev

如果A有析构函数,std :: unique_ptr <A>什么时候需要特殊的删除器?

来自分类Dev

thread_local std :: unique_ptr版本未调用析构函数

来自分类Dev

使用std :: unique_ptr的带有私有析构函数的Singleton

来自分类Dev

移动unique_ptr后,std :: unique_ptr :: get返回的值是否有效?

来自分类Dev

std :: unique_ptr使用带有很少参数的自定义删除器

来自分类Dev

为什么std :: vector的构造函数调用自定义类的析构函数?

来自分类Dev

在派生类上使用带有自定义删除程序的std :: make_unique吗?

来自分类Dev

使用std :: function对象将自定义删除器传递给std :: unique_ptr

来自分类Dev

使用std :: function对象将自定义删除器传递给std :: unique_ptr

来自分类Dev

如何允许std :: unique_ptr访问类的私有析构函数或使用私有析构函数实现C ++工厂类?

来自分类Dev

如何制作将函数包装在noexcept可检测的可调用对象中的类模板,以用作std :: unique_ptr自定义删除器?

来自分类Dev

std::unique_ptr 在虚拟析构函数上重置 SIGABRT

来自分类Dev

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

来自分类Dev

使用typedef为std :: unique_ptr指定自定义默认删除器

来自分类Dev

std :: unique_ptr,自定义删除器和类型更改

来自分类Dev

具有显式析构函数和std :: unique_ptr <>成员的类不能在std :: vector <>中使用吗?

来自分类Dev

std :: remove_if是否调用析构函数?

来自分类Dev

当我可以在析构函数中销毁对象时,为什么还要使用std :: unique_ptr?

来自分类Dev

如何将自定义删除器与std :: unique_ptr成员一起使用?

来自分类Dev

我可以使用自定义删除器简洁地声明std :: unique_ptr吗?

来自分类Dev

具有unique_ptr成员和自定义析构函数的对象的向量

来自分类Dev

具有自定义删除程序类的STL向量和unique_ptr

来自分类Dev

是否可以保证std :: unique_ptr删除顺序?

来自分类Dev

std :: unique_ptr尝试引用已删除的函数

来自分类Dev

std :: unique_ptr :: release()与std :: move()

来自分类Dev

std:map析构函数会调用键析构函数还是值析构函数?

来自分类Dev

std :: unique_ptr constexpr构造函数

Related 相关文章

  1. 1

    带有lambda自定义删除程序的std :: unique_ptr无法编译

  2. 2

    自定义删除程序以通过std :: unique_ptr释放2D数组

  3. 3

    如果A有析构函数,std :: unique_ptr <A>什么时候需要特殊的删除器?

  4. 4

    thread_local std :: unique_ptr版本未调用析构函数

  5. 5

    使用std :: unique_ptr的带有私有析构函数的Singleton

  6. 6

    移动unique_ptr后,std :: unique_ptr :: get返回的值是否有效?

  7. 7

    std :: unique_ptr使用带有很少参数的自定义删除器

  8. 8

    为什么std :: vector的构造函数调用自定义类的析构函数?

  9. 9

    在派生类上使用带有自定义删除程序的std :: make_unique吗?

  10. 10

    使用std :: function对象将自定义删除器传递给std :: unique_ptr

  11. 11

    使用std :: function对象将自定义删除器传递给std :: unique_ptr

  12. 12

    如何允许std :: unique_ptr访问类的私有析构函数或使用私有析构函数实现C ++工厂类?

  13. 13

    如何制作将函数包装在noexcept可检测的可调用对象中的类模板,以用作std :: unique_ptr自定义删除器?

  14. 14

    std::unique_ptr 在虚拟析构函数上重置 SIGABRT

  15. 15

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

  16. 16

    使用typedef为std :: unique_ptr指定自定义默认删除器

  17. 17

    std :: unique_ptr,自定义删除器和类型更改

  18. 18

    具有显式析构函数和std :: unique_ptr <>成员的类不能在std :: vector <>中使用吗?

  19. 19

    std :: remove_if是否调用析构函数?

  20. 20

    当我可以在析构函数中销毁对象时,为什么还要使用std :: unique_ptr?

  21. 21

    如何将自定义删除器与std :: unique_ptr成员一起使用?

  22. 22

    我可以使用自定义删除器简洁地声明std :: unique_ptr吗?

  23. 23

    具有unique_ptr成员和自定义析构函数的对象的向量

  24. 24

    具有自定义删除程序类的STL向量和unique_ptr

  25. 25

    是否可以保证std :: unique_ptr删除顺序?

  26. 26

    std :: unique_ptr尝试引用已删除的函数

  27. 27

    std :: unique_ptr :: release()与std :: move()

  28. 28

    std:map析构函数会调用键析构函数还是值析构函数?

  29. 29

    std :: unique_ptr constexpr构造函数

热门标签

归档