比较两种声明数组的方法

Compare two ways of declaring an array

本文关键字:方法 数组 声明 两种 比较      更新时间:2023-10-16
int buf1[] = {0,0,0,0,0};
int* buf2 = new int[5]; //assume every element is initialzed to 0 as well

我能想到的唯一区别是buf1是对数组的引用,而buf2是指向数组的指针。换句话说,buf1总是指向数组,而buf2也可以指向其他位置。

除了上面提到的那一种,两种声明(和初始化数组)的方式之间还有其他区别吗?

buf1是一个自动对象(如果它在全局作用域中,则为静态对象);*buf2是一个动态对象。也就是说,buf1的寿命是自动控制的,而*buf2的寿命是您管理的。(buf2一直存在,直到你说出类似delete[] buf2;的话。)

初始化式也不同;buf1是括号初始化的,而*buf2是默认初始化的(即它的int元素未初始化)。

在第一种情况下:

  • 使用自动(在函数范围内)或静态(在命名空间范围内)分配
  • 您已将值初始化为全零

第二种情况:

  • 使用动态分配(稍后您将不得不delete [])
  • 数组未初始化
int buf1[] = {0,0,0,0,0};

如果在块中,它会自动存储;如果在命名空间中,它会静态存储。在第一种情况下,它将一直持续到程序离开在其中声明它的块;在第二种情况下,它一直持续到程序退出。

int* buf2 = new int[5];

动态创建数组;你可以控制它的生命周期,它一直持续到你删除它(delete [] buf2)。如果不删除它,就会出现内存泄漏,这是应该避免的。为了确保正确删除动态对象,最好不要直接使用原始指针来管理它们,而应该使用RAII类,例如智能指针或容器,来为您管理它。

如果您声明int buf1[] = {0,0,0,0};在函数中退出后,数组将被销毁。在第二种情况下,你必须在使用完数组后手动删除它,就像这样delete [] buf2,但这种方式不会自动销毁,所以你可以在任何地方使用它,直到你删除它。

除了你必须清理(删除)你的第二个版本之外?第一个和第二个版本将被分配到不同的RAM区域?如果这些0是存储的而不是生成的,那么第一个0可能会占用更多的可执行空间?或者第二个版本甚至会为您清除内存为0,我不相信它会。