普通数组在栈上分配内存,栈很小;如果需要存放更多的元素,必须在堆上分配内存。
动态创建一维数组的语法:数据类型 *指针=new 数据类型[数组长度];
释放一维数组的语法:delete [] 指针;
注意:
- 动态创建的数组没有数组名,不能用sizeof运算符。
- 可以用数组表示法和指针表示法两种方式使用动态创建的数组。
- 必须使用delete[]来释放动态数组的内存(不能只用delete)。
- 不要用delete[]来释放不是new[]分配的内存。
- 不要用delete[]释放同一个内存块两次(否则等同于操作野指针)。
- 对空指针用delete[]是安全的(释放内存后,应该把指针置空nullptr)。
- 声明普通数组的时候,数组长度可以用变量,相当于在栈上动态创建数组,并且不需要释放。
- 如果内存不足,调用new会产生异常,导致程序中止;如果在new关键字后面加(std::nothrow)选项,则返回nullptr,不会产生异常。
- 为什么用delete[]释放数组的时候,不需要指定数组的大小?因为系统会自动跟踪已分配数组的内存。
示例:
#include <iostream>
int main() {
// 指定数组长度
int length = 10;
// 动态创建一维数组
int *array = new int[length];
// 使用数组
for (int i = 0; i < length; ++i) {
array[i] = i * i;
std::cout << "array[" << i << "] = " << array[i] << std::endl;
}
// 释放一维数组
delete[] array;
// 将指针置为nullptr,避免野指针
array = nullptr;
return 0;
}
这段代码中,我们首先动态创建了一个整型数组 array
,长度为 length
。通过循环初始化数组,并打印每个元素的值。使用完成后,通过 delete[]
语句释放数组占用的内存,并将指针设置为 nullptr
,以避免野指针问题。
这里没有使用 sizeof
运算符来获取动态数组的大小,因为动态数组的大小在运行时是未知的,且 sizeof
仅能返回指针变量的大小,而不是它所指向的内存区域的大小。数组的释放也不需要指定数组的大小,因为系统会跟踪动态分配的内存大小。