C++中静态数组不用释放内存吗
书上原文:既然使用静态数组无需释放内存,为何要动态分配内存?答,静态数组的长度是固定的,不能根据应用程序的需要改变,而动态内存分配可满足此需求。我想问,什么意思啊,怎么理...
书上原文:
既然使用静态数组无需释放内存,为何要动态分配内存?
答,静态数组的长度是固定的,不能根据应用程序的需要改变,而动态内存分配可满足此需求。
我想问,什么意思啊,怎么理解这句话?是静态数组分配的内存不用释放吗? 展开
既然使用静态数组无需释放内存,为何要动态分配内存?
答,静态数组的长度是固定的,不能根据应用程序的需要改变,而动态内存分配可满足此需求。
我想问,什么意思啊,怎么理解这句话?是静态数组分配的内存不用释放吗? 展开
3个回答
展开全部
追问
你还是没有回到,两者是否要释放的问题啊?求解
追答
静态分配的内存在栈里,每进入一个函数时都会建栈,栈里会存放函数用到的参数、局部变量等信息,函数执行完以后,会出栈销毁栈,这个过程就会释放你静态分配的数组内存,这是由系统自动完成的。
动态分配的内存,实际在堆上,系统没法自动帮你去释放堆上的内存,需要你自己写free或者delete来告诉操作系统需要帮你去释放堆上哪个位置的内存。
展开全部
说到底其实是堆和栈的区别。
内存中的栈区处于相对较高的地址以地址的增长方向为上的话,栈地址是向下增长的。
栈中分配局部变量空间,堆区是向上增长的用于分配程序员申请的内存空间。另外还有静态区是分配静态变量,全局变量空间的;只读区是分配常量和程序代码空间的;以及其他一些分区。
来看一个网上很流行的经典例子:
main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10); 堆
p2 = (char *)malloc(20); 堆
}
堆和栈的第一个区别就是申请方式不同:栈(英文名称是stack)是系统自动分配空间的,例如我们定义一个 char a;系统会自动在栈上为其开辟空间。而堆(英文名称是heap)则是程序员根据需要自己申请的空间,例如malloc(10);开辟十个字节的空间。由于栈上的空间是自动分配自动回收的,所以栈上的数据的生存周期只是在函数的运行过程中,运行后就释放掉,不可以再访问。而堆上的数据只要程序员不释放空间,就一直可以访问到,不过缺点是一旦忘记释放会造成内存泄露。
内存中的栈区处于相对较高的地址以地址的增长方向为上的话,栈地址是向下增长的。
栈中分配局部变量空间,堆区是向上增长的用于分配程序员申请的内存空间。另外还有静态区是分配静态变量,全局变量空间的;只读区是分配常量和程序代码空间的;以及其他一些分区。
来看一个网上很流行的经典例子:
main.cpp
int a = 0; 全局初始化区
char *p1; 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c =0; 全局(静态)初始化区
p1 = (char *)malloc(10); 堆
p2 = (char *)malloc(20); 堆
}
堆和栈的第一个区别就是申请方式不同:栈(英文名称是stack)是系统自动分配空间的,例如我们定义一个 char a;系统会自动在栈上为其开辟空间。而堆(英文名称是heap)则是程序员根据需要自己申请的空间,例如malloc(10);开辟十个字节的空间。由于栈上的空间是自动分配自动回收的,所以栈上的数据的生存周期只是在函数的运行过程中,运行后就释放掉,不可以再访问。而堆上的数据只要程序员不释放空间,就一直可以访问到,不过缺点是一旦忘记释放会造成内存泄露。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
数组 就是存放同样类型的多个数据。比如一个班上所有同学的年龄。
有的班30个人,有的班50个人。
如果你程序里面需要存储所有学生的年龄,那么用静态数组,你就必须定义一个最大的数组
比如 int ages[100] 。如果某个班上有101个人咋办,程序又要重写,改大数组 改成int ages[200] ?永远没有尽头,永远没有最大。。
那么程序提供一种方式
int count = 1000 ;
int* ages = new int[count]; //动态决定数组长度。count随实际情况决定。
回头来看
int count = 1000 ;
int ages[count]; //这种语法是错的,静态数组不能由动态变量初始化。
有的班30个人,有的班50个人。
如果你程序里面需要存储所有学生的年龄,那么用静态数组,你就必须定义一个最大的数组
比如 int ages[100] 。如果某个班上有101个人咋办,程序又要重写,改大数组 改成int ages[200] ?永远没有尽头,永远没有最大。。
那么程序提供一种方式
int count = 1000 ;
int* ages = new int[count]; //动态决定数组长度。count随实际情况决定。
回头来看
int count = 1000 ;
int ages[count]; //这种语法是错的,静态数组不能由动态变量初始化。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询