【问题标题】:C++ delete syntaxC++ 删除语法
【发布时间】:2011-03-03 12:47:28
【问题描述】:

我遇到了“删除”这个相当不寻常的用法。只是想知道以下行是删除两个指针还是只删除第一个?

delete ptr1, ptr2

【问题讨论】:

  • 顺便说一句,delete 关键字只与 C++ 相关,与 C 无关。

标签: c++


【解决方案1】:

我不会推荐它,但以下方法会起作用 -

delete ( delete p1, p2 );

这可以概括如下-

delete ( delete ( delete p1, p2 ), p3 );
delete ( delete ( delete ( delete p1, p2 ), p3 ), p4 );

【讨论】:

  • 这可能是正确的,但它完全没有帮助到极端。
  • “我不推荐它,但是霰弹枪会通过执行以下操作从你的脚趾上去除碎片......”首先不要给出不好的建议。
  • 其实了解算子的工作原理是很有用的。在这种情况下,这可能不是可取的,但还是很高兴知道。
【解决方案2】:

James McNellis 是正确的,这是逗号运算符,但他的运算符优先级错误。他(显然)认为它的结果是:

delete (ptr1, ptr2);

在这种情况下他是对的——它只会删除第二项。然而,实际上,delete 也是一个运算符,并且比逗号运算符具有更高的优先级(它的优先级尽可能低),所以它实际上是:

(delete ptr1), ptr2;

所以它删除了第一个指针,表达式的结果是第二个指针的值——它没有被删除,所以它仍然有效(如果它以前是的话)。

我赞同 Martin York 的结论,我认为这支持了它。我怀疑即使是 1% 的 C++ 程序员也像 James McNellis 一样了解 C++——当他对构造作用的回答是错误的时,这充分表明几乎没有人会知道它的真正作用。我假设没有人可以确定它正在做预期的事情。事实上,我猜它的目的是删除这两个对象,它不应该这样做(即除非编译器有错误,否则不会这样做)。

[编辑:我看到在我写这篇文章的时候,詹姆斯已经更正了他的答案。我向詹姆斯道歉——但我认为基本结论成立,所以我不会删除它,至少现在是这样。]

【讨论】:

  • 无需道歉;我最初的答案是完全错误的,事后看来,我应该在编辑时使用删除线,所以很明显它已经在五分钟的窗口中进行了编辑。
【解决方案3】:

考虑这个示例代码:

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

正如 James 已经回答的那样,原因是运算符优先级。

【讨论】:

    【解决方案4】:

    这无疑是一个错误。这里的逗号是逗号操作符,不是分隔符。仅删除第一个指针ptr1

    第二个指针ptr2 只是一个无所事事的表达式。

    delete 运算符的优先级高于 , 运算符,因此表达式被解析为就像它是写的一样:

    (delete ptr1) , (ptr2)
    

    不像是写出来的:

    delete (ptr1 , ptr2)
    

    如果, 的优先级高于delete,则只有second 指针会被删除。

    【讨论】:

    • 我虽然逗号运算符的结果是逗号分隔列表中的最后一个表达式(因此就像您的原始答案一样,它应该不是 ptr2 被删除)还是这里发生了更棘手的事情?
    • @Martin: +1 给你的答案,因为它很复杂(前两个答案最初都是不正确的;直到我写了一个例子并测试了它,我才意识到优先级问题)。我更新了为什么第一个指针被删除的解释。
    • 我发帖后就看到了,不错。如果没有编译器和测试用例,我永远不会看到这种美妙的转折
    • 不应该结论是没有办法删除1行中的多个指针吗?通过括号对指针进行分组会改变优先级,但不会多次调用 delete。
    【解决方案5】:

    光是看着就吓到我了。

    即使它是合法的也不要使用它,因为大多数人不得不停下来思考(并且仍然会弄错(前两个答案中的一个必须是错误的,因为它们相互矛盾,我的第一直觉是逗号运营商问题(但我不知道)))。

    即使现在我也不会回答这个问题,直到我写了一个例子并对其进行了测试,即使那样我也会害怕语言中会导致问题的极端情况。

    【讨论】:

    • 每天写 Lisp?顺便说一句,你忘记了):P
    • 已修复(现在超过 15 个字符):-)
    猜你喜欢
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-27
    • 2015-02-08
    • 2012-08-07
    • 1970-01-01
    相关资源
    最近更新 更多