当我可以写的时候
int n[] {1, 2, 3};
我不会写
int *m = new int[] {1, 2, 3};
这应该是
int *m = new int[3] {1, 2, 3};
这是什么原因呢?
发布于 2015-06-05 18:56:39
记住,实际上是C++中的一个运算符。
这是因为new运算符是如何定义的;即,它需要显式地将请求的内存大小作为输入参数。因此,它不会通过初始值设定项列表成员的计数来推断。
发布于 2015-06-05 19:03:34
要理解这一点,您需要了解new操作符works.new如何返回指向分配的新内存块的开头的指针。所以当我们说
int* p = new int;
我们分配内存来包含一个单一的元素。但是当我们说
int* foo = new [3];
我们为int类型的元素分配一个内存块,其中"3“是整数类型的内存块的数量。这将告诉编译器为3个整数分配内存。当我们这样做的时候
int* p = new int[3]{1,2,3}
我们要求编译器分配3个内存位置来存储整型的值。同时,我们也为这些内存位置赋值。
现在如果我们这样做
int* p = new int[] {1,2,3}
我们没有告诉编译器要分配多少内存,但同时我们试图分配给3个内存位置,但我们没有分配那么多内存。在这种情况下,编译器只分配1块内存。所以第一个值被赋值。这将导致运行时错误。
现在奇怪的是,如果下面的代码是允许的,并且编译器足够智能,可以分配3个值
int n[] = {1, 2, 3}
为什么不在这种情况下呢?
int *p = new int [] {1,2,3}
我认为这就是问题所在,因为新的运算符是如何设计的。你可以试着重载new操作符来解决这个问题。
希望这能有所帮助。
编辑:我在VS中尝试了一些虚拟代码。看起来如果你这么做
int* p = new int [] {1,2,3}
这是一次崩溃。但是当你这样做的时候
int* p = new int []{1}
这完全没问题。这证明编译器将其解释为仅分配1块内存的命令。
https://stackoverflow.com/questions/30664512
复制相似问题