繁体   English   中英

C ++ 11 Destructor = delete

[英]C++11 Destructor = delete

我在这里看到了一个构造函数=删除解释但我想知道我是否应该禁止析构函数调用。 我正在尝试使用这样的类:

class A
{
public:
    static bool foo(const char* filePath);
    static void foo(const int something);
private:
    A() = delete;
    ~A();
};

我也应该写像~A() = delete; 还有? 它甚至重要吗?

~A() = delete; 是多余的,因为你不能创建一个对象,所以没有必要担心析构函数。

实际上你的代码甚至不需要A() = delete; ,因为所有的班级成员都是static
正如Luchian在评论中正确提到的,这样的class最好被声明为namespace 根据要求,可以将基础数据设置为extern / static

(注意:在C ++ 20中,删除聚合的构造函数现在使得类型无法构造,因此不再出现意外行为)

要在此处添加其他答案,您可能希望将析构函数声明为已删除而不是私有而未实现。 这是因为,即使使用private删除的构造函数,您仍然可以使用聚合初始化来创建实例:

演示

class A
{
public:
    static bool foo(const char* filePath);
    static void foo(const int something);
private:
    A() = delete;
};

int main(){
   A a{}; // whoops I just created an instance
}

但是,如果将析构函数声明为已删除,则默认构造或聚合初始化都不起作用 - 它无法编译,因为编译器无法为A 调用析构函数

演示

class A
{
public:
    static bool foo(const char* filePath);
    static void foo(const int something);
    ~A() = delete;
};

int main(){
   A a{}; // fails
   A b; // fails
}

由于您已经将析构函数声明为私有而未实现,因此所有其他内容都是多余的。 C ++ 11使得在析构函数中不需要private ,just = delete更容易。 明确地将析构函数声明为已删除是优选的,因为它与您从未打算实现它的其他程序员进行通信。 你拥有它的方式,一些程序员可能最初认为你只是忘了包含实现。


您将要声明这两个默认构造函数析构函数,以防止动态内存分配(通过删除new放置新的 ),因为我们,否则不会得到一个编译错误,因为它现在是我们来调用delete或明确调用析构函数。 如果我们方便忘记,那么事情就好了:

演示

class A
{
public:
    static bool foo(const char* filePath);
    static void foo(const int something);
    ~A() = delete;
};

int main(){
    A* a = new A(); // whoops I created an instance
    // we leak memory
}

安置新演示

但删除构造函数和析构函数可以防止这种情况:

演示

class A
{
public:
    static bool foo(const char* filePath);
    static void foo(const int something);
    ~A() = delete;
    A() = delete;
};

int main(){
    A* a = new A(); // doesnt compile
    A b{}; // doesn't compile
    A c; // doesn't compile
}

参考[class.dtor]:“如果可能调用的析构函数被删除或无法从调用的上下文访问,则程序格式错误。”

不,没关系。 您也可以将其删除,但如果构造函数被删除,则删除析构函数将不会执行任何其他操作。

第一个(已删除的构造函数)告诉您无法创建对象。 第二个(删除的析构函数)告诉我们不可能销毁对象。

请注意,可以使用各种hack“创建”和初始化对象,但在这些情况下,所有的注意都会关闭,并且程序正在执行未定义的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM