这个动态分配是做什么用的?

6
今天,我发现您可以在C++中编写并编译以下代码:
int* ptr = new int(5, 6);

这是什么目的?我当然知道动态的new int(5),但在这里我有点迷茫。有线索吗?

4
就这个问题而言,正确的方法是 int* ptr = new int((5, 6));int(5,6) 应该会导致错误,但将其放在括号中会将其转换为6,然后使用它。话虽如此,这看起来很丑陋。 - GManNickG
@GMan:你应该把这个作为回答,这样我们可以点赞它。 - Zacky112
5个回答

13
你正在使用逗号运算符,它只会计算最右边的一个值。
逗号运算符(,)用于分隔两个或多个表达式,这些表达式在只需要一个表达式的位置上被包含。当需要对表达式集合进行计算时,只有最右边的表达式会被考虑。 来源 指针所指向的内存地址以上面的值6进行了初始化。

逗号运算符(,)会丢弃其第一个操作数,因此它与new int(6)相同,对吗? - elmattic
3
没错。但是你可以用其他数字代替5,只要你想要评估并返回6的那个表达式。它会评估所有表达式,但是只会返回最后一个表达式的结果。 - Brian R. Bondy
1
但是在这个链接中,微软表示:“在逗号通常用作分隔符的情况下(例如在函数的实际参数或聚合初始化器中),逗号运算符及其操作数必须用括号括起来。” 那么,在int(expression)中的表达式是否算作参数列表,因此逗号会被视为分隔符而进行评估呢? - Bob
1
我猜测新的初始化器既不是函数也不是聚合初始化器。 - Brian R. Bondy
1
就此而言,g++将其解析为分隔符,而不是逗号运算符。熟悉C++规范的人知道哪个是正确的吗? - McPherrinM

1

只需这样做:

int* ptr = new int(6);

就逗号运算符而言,只有在没有它无法完成所需任务时才使用它。没有必要应用诸如以下的技巧:

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

1

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

你在哪个编译器或代码中看到这个问题的?


它可以在MSVC 6.0中编译,并使用值6初始化位置指针。 - Rajendra Uppal

1

我认为这是一个错误,本意是要分配某种2D数组。然而,在C++中你不能这样做。这段代码实际上可以编译,因为它利用了逗号运算符,该运算符返回最后一个表达式并忽略所有其他表达式的结果。这意味着该语句等同于:

int* ptr = new int(6);

1

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

由逗号运算符分隔的一组语句的结果是最后一个语句的值,因此int被初始化为6


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接