C++中的数组
动态分配数组和静态分配数组在 C++ 中有以下几个主要区别:
栈上的数组(静态分配)
/*
*
* 在C++中,局部变量(如栈上的数组)的内存管理是由编译器自动处理的。
*
* 当局部变量的作用域结束时,编译器会自动释放局部变量所占用的内存。
*
* 这意味着我们不用(也不能)手动释放局部变量中的数组内存
*
*/
int main()
{
//定义数组(并在main函数的栈上分配内存)
int a[10];
//给数组中的元素赋值
for (int i = 0; i < 10; i++)
{
a[i] = i + 11;
}
// 还可以这样定义数组
int arrA[] = { 123,23,90 };//声明数组没有指定元素个数,个数由初始化决定
int arrB[5] = { 123,23,90 };//声明特定长度的数组,并且定义、初始化
//main 函数执行完毕并返回时,编译器会自动释放局部变量所占用的内存
}
堆上的数组(动态分配)
当我们使用 XXXX* m = new XXXX[count]; 这样的语句时,我们正在动态分配一个数组。
这种方式与在栈上分配数组(如 XXXX m[count];)有以下几个主要区别:
1、内存位置:动态分配的数组存储在堆(heap)上,而不是栈(stack)上。堆内存的生命周期不由创建它的作用域决定,而是需要显式管理。
2、内存管理:动态分配的内存需要使用 delete[] 来释放,而栈上分配的内存在作用域结束时自动释放。
3、灵活性:动态分配允许在运行时决定数组的大小,而栈上分配的数组大小必须在编译时已知。
4、性能:静态分配是在编译时或程序启动时分配内存,通常更快,因为栈分配和释放速度较快,且没有额外的内存管理开销;动态分配内存是在运行时分配内存,可能较慢,因为涉及到堆分配的额外开销,且需要手动管理内存。但是,动态分配对于大型数据结构,堆分配可以提供更多的灵活性。
5、内存限制:栈内存有限,通常远小于堆内存。如果需要分配大量内存,动态分配是必要的。
#include <iostream>
int main() {
// 在运行时,用户输入数组的大小
int count;
std::cout << "Enter the number of elements: ";
std::cin >> count;
// 动态分配数组
int* arr = new int[count];
// 使用数组
for (int i = 0; i < count; ++i) {
arr[i] = i + 1;
}
// 打印数组
for (int i = 0; i < count; ++i) {
std::cout << arr[i] << " ";
}
std::cout << std::endl;
// 释放动态分配的数组内存
delete[] arr;
return 0;
}
使用动态分配数组的一些场景包括:
-
当数组的大小在编译时未知,需要在运行时确定。
-
当处理的数据量非常大,超出了栈内存的限制。
-
当需要在多个函数之间共享数组,并且希望避免复制数据时。
-
当数组的生命周期需要跨越多个作用域,或者需要持久化存储数据时。