C ++虚拟运营商删除?(C++ Virtual operator delete?)

2019-07-05 10:29发布

是否有可能有一个虚拟delete运算符? 我不是说析构函数,我指的是实际操作符重载。

减去事实上,它是(在大多数情况下)大坏主意重载new和delete(是的,我已经知道这是异端邪说),我想知道什么样的影响都来自于使用虚拟delete运算符。

我想尝试使用虚拟删除,因为有时我可能有一子类重载删除,存储在一个基类指针。 从技术上讲,我真的不看到过这种情况即将太多修成正果,除非我有不同的节点类型的树(在第一位潜在危险的想法,如果你问我)。

我只是想知道这将是一个虚拟的,还是非虚拟的潜在利弊,删除操作符重载。

Answer 1:

你不能显式声明operator deletevirtual

这是一个静态成员函数,即使你不提供关键字static

但是operator delete 在最派生类中定义的使用意义已经虚 。 您可以选择,就好像它是由析构函数调用来想起来。 它甚至可能。 ;-)


C ++ 11§12.4/ 12:
“在一个虚拟的析构函数的定义的点(包括隐式定义(12.8)),非阵列释放函数是在析构函数的类(10.2)的范围抬头,并且,如果没有声明被找到时,功能在全球范围内被抬起头来。”


C ++ 11§12.5/ 4:
“如果一个delete表达式用一元开始::运算符,释放函数的名字在全球范围内抬头。 否则,如果删除-expression用于解除分配一个类对象,其静态类型有一个虚拟析构函数,解除分配的功能是在动态类型的虚拟析构函数(12.4)的定义的点中选择的一个。 117否则,如果delete表达式用于删除类的一个对象T或其阵列,所述静态和动态类型的对象应是相同的,并且解除分配功能的名称中的范围的抬头T 。 如果查找无法找到名字,这个名字在全球范围内抬头。 如果查找的结果是不明确的或不可访问,或者如果所述查找选择放置释放函数,程序是非法的构造“。



Answer 2:

否-即使你不进行相应的标记,当/如果你超载new / delete的一类,他们最终的静态成员函数1,和静态成员函数不能是虚的。

为了工作,他们真正需要的是静态的 - 它们是用来分配/释放的某个对象的内存,所以要发生的对象开始施工前/它完成后销毁。 很显然你不能把它分配什么最终将成为一个类的实例内存,并在同一时间拥有它依赖于已经作为类(一个虚函数做)的一个实例。


  1. §12.5/ 1:

对于T类的任何分配函数是静态成员(即使没有明确声明为静态)。

和§12.5/ 6:

一类X任意释放函数是静态成员(即使没有明确声明为静态)。

...任何人谁在乎的官方声明。 有趣的是如何是一个“类T”当你分配,以及“X类”当你释放。



Answer 3:

没有-你不能有一个虚拟运营商删除-类特定的newdelete重载必须是静态成员函数-具体到类,而不是对象。

你不能有虚静态成员函数。

看到标准,其中规定的部分12.5.7“自从构件分配和解除分配功能是静态它们不能是虚拟的。”



Answer 4:

1)是的,当然你可以重载删除。 不,超载不能是虚函数。

2)“优点和缺点”取决于你想要做什么完全。

3)当然,操作符重载的整体思想 - 像在C这么多++ - 可以说是愚蠢的,不必要的和危险的。

SOOOOOO .....

4)如果你不需要它,那么不这样做:)

恕我直言...



文章来源: C++ Virtual operator delete?