是否允许此动态数组分配

时间:2014-10-14 15:33:04

标签: c++ arrays allocation

int n[] = {1000,5000,100000,105000,400000,500000,505000,800000,995000,1000000};

int *array1 = new int[n[0]]; //1000
int *array2 = new int[n[1]]; //5000

这对于创建array1尺寸1000array2尺寸5000是否有效?

即使经过一年的编程,这些东西仍然让我兴奋不已。

我的第二个问题:有没有办法自动将每个位置的所有值设置为NULL或0?因为在打印数组后,第一个数字块是:

1163089152
1330794578
1162627398
1547322173
1919251285
1766218867
7367020
1129595223
1128090959
1635212346
1836016500
1852405504
1030908260
1465662019
1868852841
29559
1625020798
134224442
4199212
4234532
4234544
4209436
4200378
4286800
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1910233198
134224636
1985292544
1985292576
1985292608
1985292640
1985292672
1985292704
1985292736
1985292768
1985292800
1985292832
1985292864
1985292896
1985292928
1985292960
1985292992
1985293024
1985293056
1985293088
1985293120
1985293152
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0 

... .... .....

在我目前的任务中,效率是关键。循环遍历1000个元素只是为了将它们设置为0或NULL似乎......效率不高

编辑:问题解决了,谢谢大家的快速答案!

6 个答案:

答案 0 :(得分:9)

  1. 是的,这是分配内存的有效方式
  2. 不,这些值不会被赋予任何特定值。 You can value* initialize them如果你愿意的话:

    int *array1 = new int[n[0]](); // Introduced in C++98
    int *array1 = new int[n[0]]{}; // Introduced in C++11
    
  3. 这会将所有值初始化为零。

    *"默认初始化"在这个上下文中是"value initialization"的口语用词,它是在C ++ 03中引入的,并且几乎总是当人们说"默认初始化"。

答案 1 :(得分:3)

是的,没关系,但是如果你想将数组数据初始化为零,那么你需要:

int *array1 = new int[n[0]]();
int *array2 = new int[n[1]]();
                          ^^^^

你可能想考虑使用稍微更新的C ++习语 - std::vector可能是比原始数组更好的选择:

std::vector<int> array1(n[0]);
std::vector<int> array2(n[1]);

答案 2 :(得分:3)

  1. 是的,这是有效的。
  2. 这是没有经营的。要将元素初始化为0,请使用

     int *array1 = new int[n[0]]();
     //                         ^^
    

答案 3 :(得分:3)

  

这对于创建array1 size 1000和array2 size 5000是否有效?

是的,它是有效的,因为您使用的是运算符new[]。如果您声明int array1[n[0]],那么您将依赖于扩展,因为C ++不支持可变长度数组。

  

是否所有数组位置都设置为NULL或0?

都不是。在您分配这些值之前,这些值将是未定义的(这是一种说“垃圾”的奇特方式)。您可以在调用new[]之后附加一对括号来强制进行初始化。

答案 4 :(得分:2)

operator new[]正在进行动态内存分配,无论以何种方式传递值都是有效的。不会初始化任何值,您不应忘记为该指针调用delete[]或使用智能指针。

更好的方法是使用std::vector -

std::vector<int> array1( n[0] );
std::vector<int> array2( n[1] );

您不必担心内存释放,数据将被初始化。如果需要初始化一些不同于0的值,只需将其作为第二个参数传递:

std::vector<int> array1( n[0], 123 );
std::vector<int> array2( n[1], 456 );

答案 5 :(得分:1)

  

这对于创建大小为1000的array1和大小为5000的array2是否有效?

是。但是,您最好使用自动管理的动态数组:

std::vector<int> array1(1000);

一旦你完成了数组,就可以省去记住删除数组的麻烦。如果没有RAII,那就很难做到这一点。

  

是否所有数组位置都设置为NULL或0?

没有。 new将默认初始化它创建的对象;对于像int这样的原始类型,默认初始化不做任何事情,使它们具有不确定的值。

如果您希望将它们的值初始化为零,则可以指定:

int *array1 = new int[n[0]]();
                           ^^

或使用vector,除非您指定其他初始值,否则将对其进行值初始化。