C ++删除语法
我遇到了这种相当不寻常的使用“删除”。 只是想知道下面的行是删除这两个指针还是只删除了第一个?
delete ptr1, ptr2
这无疑是一个错误。 这里的逗号是逗号运算符,而不是分隔符。 只有第一个指针ptr1
被删除。
第二个指针ptr2
只是一个无所事事的expression。
delete
操作符比操作符具有更高的优先级,因此expression式被parsing为写入:
(delete ptr1) , (ptr2)
而不是写成:
delete (ptr1 , ptr2)
如果优先级高于delete
,则只有第二个指针被删除。
詹姆斯·麦克奈利斯(James McNellis)这个逗号运算符是正确的,但是他有错误的运算符优先级。 他(显然)认为它的工作原理是:
delete (ptr1, ptr2);
在这种情况下,他是对的 – 它只会删除第二个项目。 但实际上,删除也是一个运算符,并且比逗号运算符(优先级尽可能低)具有更高的优先级,所以它确实是:
(delete ptr1), ptr2;
所以它删除了第一个指针,而expression式的结果是第二个指针的值 – 它还没有被删除,所以它仍然是有效的(如果是以前的)。
我会回应马丁·约克的结论,我认为这是支持的。 我怀疑即使是C ++程序员的一个百分比,C ++和James McNellis也知道 – 当他的答案是错误的时候,几乎没有人会知道它究竟做了什么。 我认为没有人能确定它正在做什么。 实际上,我猜想这是为了删除两个对象,它不应该这样做(即,除非编译器有bug)。
[编辑:我看到,当我写这个,詹姆斯已经纠正了他的答案。 我向詹姆斯道歉 – 但是我认为基本的结论是可以的,所以我不会删除这个,至less现在是这样。]
只是看着它吓了我一跳。
不要使用这个,即使它是合法的,因为大多数人不得不停下来思考(并且仍然会弄错它(前两个答案中的一个必须是错的,因为它们相互矛盾,我的第一个本能是逗号操作符问题但我不知道)))。
即使现在,我还没有回答这个问题,直到我写了一个例子并进行了testing,即使这样,我也会害怕使用会导致问题的语言。
考虑这个示例代码:
class foo { int _a; public: foo(int a) : _a(a) { } ~foo() { printf("~foo() %d\n", _a); } }; int main(int argc, char** argv) { foo *p1 = new foo(1), *p2 = new foo(2); delete p1, p2; return 0; }
输出是:
~foo() 1
正如詹姆斯已经回答的那样,原因是运营商的优先。
我不会推荐它,但以下将起作用 –
delete ( delete p1, p2 );
这可以概括如下 –
delete ( delete ( delete p1, p2 ), p3 ); delete ( delete ( delete ( delete p1, p2 ), p3 ), p4 );