比较两种声明数组的方法
Compare two ways of declaring an array
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,我不相信它会。
- 初始化具有非默认构造函数的std::数组项的更好方法
- 复制几乎为空的数组的最快方法
- 通过JNI传递数据数组的最快方法是什么
- 在调用接收数组的方法时,模板化数组大小是不是一种糟糕的做法
- 数组元素打印的递归方法
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 在 c++ 中对类中的 c 字符串动态数组进行排序的最佳方法是什么?
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- C++数组队列实现方法错误
- 寻找一种更好的方法来表示无符号字符数组
- 在 C++ 中将整数数组转换为位集表示形式的最佳方法?
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- 创建异构顶点数据数组的可移植方法
- 打印字符数组地址的正确方法
- 还有其他方法可以在数组中写入多维数组吗?
- 从数组中删除非唯一值、保持顺序和不使用向量的最佳方法?
- 有没有一种惯用的方法可以在不存储变换或不必要地重新计算的情况下找到数组变换的最小/最大值?
- 从非类型模板参数声明 constexpr 数组的可移植方法
- 初始化不是整数的巨大常量多维数组的最佳方法是什么?
- 仅通过C++中数组初始化的不同方法,即可在同一输入上获得两个不同的答案