虽然我可以写
int n[] {1, 2, 3};
我不能写
int *m = new int[] {1, 2, 3};
应该是
int *m = new int[3] {1, 2, 3};
这是什么原因?
答案 0 :(得分:0)
请记住, new 实际上是C ++中的运算符。
这是因为如何定义新的运算符;即它明确地需要所请求存储器的大小作为输入参数。因此,初始化程序列表成员的数量不会推断出它。
答案 1 :(得分:-2)
要理解这一点,您需要了解新运算符的工作原理.new返回指向新分配的内存块开头的指针。所以当我们说
时int* p = new int;
我们正在分配内存以包含一个单独的元素。但是当我们说
时int* foo = new [3];
我们为int类型的元素分配一块内存,其中“3”是整数类型的内存块数。所以这告诉编译器为3个整数分配内存。 当我们这样做时
int* p = new int[3]{1,2,3}
我们要求编译器分配3个内存位置,它将存储integer类型的值。与此同时,我们还将值分配给这些内存位置。
现在,如果我们这样做
int* p = new int[] {1,2,3}
我们没有告诉编译器要分配多少内存,但同时我们尝试分配3个内存位置,但是我们没有分配那么多内存。在这种情况下,编译器仅分配1块内存。所以第一个值被赋值。这将导致运行时错误。
现在奇怪的是,如果允许以下内容并且编译器足够智能以分配3个值
int n[] = {1, 2, 3}
为什么不在这种情况下
int *p = new int [] {1,2,3}
我认为这是问题,因为新操作符的设计方式。您可以尝试重载新运算符并解决此问题。
希望这有帮助。
编辑:我在VS中尝试了一些虚拟代码。好像你这样做int* p = new int [] {1,2,3}
它崩溃了。但是当你这样做时
int* p = new int []{1}
这完全没问题。这证明编译器将其解释为仅分配1块内存的命令。