【问题标题】:What does this dynamic allocation do?这种动态分配有什么作用?
【发布时间】:2011-01-21 16:18:38
【问题描述】:

今天发现可以用C++编写这样的代码并编译:

int* ptr = new int(5, 6);

这样做的目的是什么?我当然知道动态new int(5) 的事情,但在这里我迷路了。有什么线索吗?

【问题讨论】:

  • 不管怎样,在这种情况下正确的做法是int* ptr = new int((5, 6));int(5,6) 应该会导致错误,但是将其放在括号中会将其变为 6,然后使用它。也就是说,它很丑。 :)
  • @GMan:您应该将此作为答案,以便我们投票。

标签: c++ new-operator dynamic-memory-allocation comma-operator


【解决方案1】:

您正在使用逗号运算符,它只计算一个值(最右边的)。

逗号运算符 (,) 用于 分隔两个或多个表达式 包含在只有一个表达式的情况下 是期待。当集 表达式必须被评估为 值,只有最右边的表达式 被考虑。

Source

指针指向的内存地址被初始化为上面的值6。

【讨论】:

  • 由于运算符(,)丢弃了它的第一个操作数,它与new int(6)相同。对吗?
  • 是的,这是正确的。但是你可以有一些其他的表达式而不是你想要评估的 5 并返回 6。它将评估所有表达式,但返回最后一个。
  • msdn.microsoft.com/en-us/library/zs06xbxh(VS.80).aspx 但是在那个链接微软说“逗号通常用作分隔符(例如在函数或聚合初始化程序的实际参数中),逗号运算符及其操作数必须包含在括号。” int(expression) 中的表达式不会算作参数列表,因此逗号不会被计算为分隔符吗?
  • 我猜新的初始化器不是函数也不是聚合初始化器。
  • FWIW,g++ 将其解析为分隔符,而不是逗号运算符。熟悉 C++ 规范的人知道哪个是正确的吗?
【解决方案2】:

我的编译器 g++ 在尝试执行此操作时返回错误。

你在什么编译器或代码中看到了这个?

【讨论】:

  • 它在 MSVC 6.0 中编译并用值 6 初始化位置 ptr。
【解决方案3】:

我认为这是分配某种二维数组的错误。但是,您不能在 C++ 中做到这一点。 sn-p 实际上是编译的,因为它使用了逗号运算符,它返回最后一个表达式并忽略所有其他表达式的结果。这意味着该语句等效于:

int* ptr = new int(6);

【讨论】:

    【解决方案4】:

    5 被忽略。这会在堆上分配一个 int 并将其初始化为 (5,6)。

    逗号分隔的一组语句的结果是最后一条语句的值,所以int初始化为6

    【讨论】:

      【解决方案5】:

      只需这样做:

      int* ptr = new int(6);
      

      就逗号运算符而言,如果没有它就无法完成所需的任务,请使用它。应用以下技巧是没有用的:

      int* ptr = new int(5, 6);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-17
        • 1970-01-01
        • 1970-01-01
        • 2021-03-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多