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;
}

使用动态分配数组的一些场景包括:

  • 当数组的大小在编译时未知,需要在运行时确定。

  • 当处理的数据量非常大,超出了栈内存的限制。

  • 当需要在多个函数之间共享数组,并且希望避免复制数据时。

  • 当数组的生命周期需要跨越多个作用域,或者需要持久化存储数据时。

posted @ 2025-01-03 15:14  青云Zeo  阅读(1)  评论(0编辑  收藏  举报