为什么标准让我免费存储分配没有析构函数的类?

Mac*_*Mac 5 c++ c++11 c++14

如果你有一个没有析构函数的类:

struct A {
    ~A() = delete;
};
Run Code Online (Sandbox Code Playgroud)

该标准不允许我"本地"分配该类的实例:

int main()
{
    A a; //error
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我在免费商店分配它似乎没关系:

int main()
{
    a *p = new A();
}
Run Code Online (Sandbox Code Playgroud)

只要我不在该指针上调用delete:

int main()
{
    a *p = new A();
    delete p; //error
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,如果我在免费商店分配它,为什么标准让我有一个没有析构函数的类?我猜有一些用例吗?但到底是什么?

Nic*_*las 7

所以我的问题是,如果我在免费商店分配它,为什么标准让我有一个没有析构函数的类?

因为这不是标准功能的工作原理.

= delete您所谈论的语法是为解决许多问题而发明的.其中一个非常具体:制作只移动或不移动的类型,如果您尝试调用复制(或移动)构造函数/赋值运算符,编译器将为此发出编译时错误.

但是,一般应用时,语法还有其他用途.通过=delete一个函数,您可以阻止人们调用函数的特定重载,主要是为了阻止某些有问题的隐式转换.如果不调用具有特定类型的函数,则会因调用deleted重载而出现编译时错误.因此,=delete允许应用于任何功能.

并且类的析构函数被定义为"任何函数".

该功能的设计意图不是制作不可破坏的类型.这只是允许=delete任何功能的产物.这不是设计或意图; 它只是.

尽管应用于=delete析构函数没有多大用处,但是在规范中明确禁止它在析构函数上的使用也没有多大用处.还有肯定没有做出多大用处=delete当应用于析构函数表现不同.


Fan*_*Fox 5

有了这个:

A a;
Run Code Online (Sandbox Code Playgroud)

您将在退出作用域时调用析构函数(并且您已删除了析构函数,因此错误).有了这个:

A *a = new A();
Run Code Online (Sandbox Code Playgroud)

你根本就不会调用析构函数(因为你从不使用delete).在程序完成时清理内存,但实质上是保证内存泄漏.

没有理由c++不允许这种行为,因为这会创建一个非常具体的案例来编程到编译器中.例如,c++不允许这样做:

int *p; *p = 5;
Run Code Online (Sandbox Code Playgroud)

虽然这显然很糟糕,但总是很糟糕.程序员应该确保他们不这样做.

您没有理由删除析构函数,因为它不是一种有用的行为.