我遇到了'删除'的这种相当不寻常的用法。只是想知道以下行是删除指针还是仅删除第一行?
delete ptr1, ptr2
答案 0 :(得分:53)
这无疑是一个错误。这里的逗号是逗号运算符,而不是分隔符。仅删除第一个指针ptr1
。
第二个指针ptr2
只是一个无用的表达。
delete
运算符的优先级高于,
运算符,因此表达式的解析就像它被写入一样:
(delete ptr1) , (ptr2)
并不像是写的那样:
delete (ptr1 , ptr2)
如果,
的优先级高于delete
,则只会删除第二个指针。
答案 1 :(得分:11)
James McNellis这是逗号运算符是正确的,但他的运算符优先级错误。他(显然)认为它可以解决:
delete (ptr1, ptr2);
在这种情况下他是对的 - 它只会删除第二项。然而,实际上,delete也是一个运算符,并且具有比逗号运算符(其具有尽可能低的优先级)更高的优先级,因此它实际上可以用作:
(delete ptr1), ptr2;
所以它删除了第一个指针,表达式的结果是第二个指针的值 - 它还没有被删除,所以它仍然有效(如果它以前是)。
我赞同马丁·约克的结论,我认为这可以支持它。我怀疑即使只有百分之一的C ++程序员知道C ++以及James McNellis - 当他对构造的作用的答案是错误的时候,这是一个可靠的迹象,几乎没有人会知道它的真正作用。我认为没有人可以确定它正在做的事情。事实上,我猜它是打算删除 不应该做的两个对象(即,除非编译器有错误,否则不会)。
<编辑:我看到,在我写这篇文章的时候,詹姆斯已经纠正了他的回答。我向詹姆斯道歉 - 但我认为基本结论是正确的,所以我不会删除这个,至少目前是这样。]答案 2 :(得分:5)
看着它吓到了我。
即使它是合法的也不要使用它,因为大多数人必须停下来思考(并且仍然会弄错)(前两个答案中的一个必须是错误的,因为它们相互矛盾,我的第一直觉是逗号操作员问题(但我不知道)))。
即使是现在我也不会回答这个问题,直到我编写了一个例子并对其进行了测试,即便如此,我也会害怕会出现问题的语言中的角落案例。
答案 3 :(得分:5)
请考虑以下示例代码:
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
正如詹姆斯已经回答的那样,原因是运营商优先。
答案 4 :(得分:5)
我不推荐它,但以下内容可行 -
delete ( delete p1, p2 );
这可以概括如下 -
delete ( delete ( delete p1, p2 ), p3 );
delete ( delete ( delete ( delete p1, p2 ), p3 ), p4 );