【问题标题】:Destructing objects with private destructors使用私有析构函数解构对象
【发布时间】:2021-03-17 14:22:14
【问题描述】:

我目前正在开发一个生成 C++ 代码的程序。这个生成的 C++ 代码有时需要破坏一个类,所以它使用了

ptr->~MyClass();

,因为这适用于所有极端情况(包括例如继承的析构函数)。或者我想:如果有一个私有析构函数:

class MyClass {
    ~MyClass();
};

那么ptr->~MyClass();会是编译时错误。

任何想法我可以做什么?如果析构函数是私有的,生成的代码要么调用它,要么抛出异常,要么退出程序。

请注意,我的代码生成器不知道哪个类有私有析构函数,哪个类没有私有析构函数。

【问题讨论】:

    标签: c++ destructor


    【解决方案1】:

    您可以使用 SFINAE:

    template <typename T>
    auto destruct(T* t) -> decltype(t->~T()) { t->~T(); }
    
    auto destruct(void*) { /*  throw, exit, ... */ }
    

    Demo

    【讨论】:

      【解决方案2】:

      您不应该显式调用析构函数!当对象超出范围时会自动调用它。

      【讨论】:

      • 代码是不同编程语言接口的包装。所以是的,我需要显式调用它,否则它不会被调用,因为两种语言有不同的作用域。
      • 这是个好建议,但仅适用于某些情况(不适用于我的情况)。您应该不希望显式调用析构函数,但有时您需要这样做。
      • 智能指针在语言边界上并不智能。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-26
      • 2016-02-10
      • 2017-10-08
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      • 2013-12-27
      相关资源
      最近更新 更多