如果你有一个没有析构函数的类:
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)
所以我的问题是,如果我在免费商店分配它,为什么标准让我有一个没有析构函数的类?我猜有一些用例吗?但到底是什么?
所以我的问题是,如果我在免费商店分配它,为什么标准让我有一个没有析构函数的类?
因为这不是标准功能的工作原理.
= delete您所谈论的语法是为解决许多问题而发明的.其中一个非常具体:制作只移动或不移动的类型,如果您尝试调用复制(或移动)构造函数/赋值运算符,编译器将为此发出编译时错误.
但是,一般应用时,语法还有其他用途.通过=delete一个函数,您可以阻止人们调用函数的特定重载,主要是为了阻止某些有问题的隐式转换.如果不调用具有特定类型的函数,则会因调用deleted重载而出现编译时错误.因此,=delete允许应用于任何功能.
并且类的析构函数被定义为"任何函数".
该功能的设计意图不是制作不可破坏的类型.这只是允许=delete任何功能的产物.这不是设计或意图; 它只是.
尽管应用于=delete析构函数没有多大用处,但是在规范中明确禁止它在析构函数上的使用也没有多大用处.还有肯定没有做出多大用处=delete当应用于析构函数表现不同.
有了这个:
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)
虽然这显然很糟糕,但总是很糟糕.程序员应该确保他们不这样做.
您没有理由删除析构函数,因为它不是一种有用的行为.
| 归档时间: |
|
| 查看次数: |
215 次 |
| 最近记录: |