当前位置:首页 > 内存 > 正文

动态内存分配三种方式

  • 内存
  • 2024-06-07 13:38:20
  • 4462

一、程序中动态分配的内存存放在哪个区域

正在进行的内存动态存储在堆内存区域中。

称为堆。C语言:char*p1;p1=(char*)malloc(10);//在栈区分配10字节的区域。

C++语言:用new分配,用delete释放,在堆区。使用malloc进行分配,用于免费释放,在堆等免费文件中。堆与栈的不同之处在于,它的数据结构不被系统(无论是机器系统还是操作系统)支持,而是由函数库提供。

直接法:

多道程序设计技术尚未出现,可用内存空间几乎是给定的。当时,程序员在编程或编译器编译源代码时使用实际的内存地址。

系统资源一次只能被一个用户占用。当多道程序出现时,用户会感觉很不舒服,因为用户自己分配主存,而且需要不止一块内存。这增加了用户的负担,并且使用的系统存储空间也相当低。


二、C语言中堆和栈的区别?(1)申请方法
stack:
由系统自动设置。例如,在函数中声明一个局部变量,系统会自动为a在栈上释放空间:
程序员必须为其申请并在c函数malloc中指定大小
如m1=(char*)malloc(10);
在C++中使用new运算符
例如,m2=(char*)malloc(10);
注:m1和m2本身就是在堆栈中。
(2)申请后系统响应
堆栈:只要剩余的堆栈空间大于申请的空间,系统就会为程序提供内存,否则会报异常触发堆栈溢出。
堆:首先你应该知道,操作系统有一个链表,记录着空闲内存的地址,当系统收到程序的申请时,就会遍历这个链表,寻找第一个。堆中空间大于所需空间的节点,然后add将节点从空闲节点列表中删除,并将该节点空间分配给程序该内存空间的首地址,这样,代码中的Delete正好可以释放这个内存空间。另外,由于找到的堆节点的大小可能不完全等于请求的大小,系统会自动将多余的放回到空闲链表中。
(3)应用程序大小限制和增长方向
栈:在Windows中,栈是一种跨越低地址的数据结构,是一块连续的内存区域。这句话的意思是,系统默认栈顶地址和最大栈容量,在WINDOWS下,栈大小为2M(也可以是1M,这是一个编译时常量)。因此,堆栈的可用空间较少。
堆:堆是一种跨越高地址的数据结构,是一个不连续的内存区域。这是因为系统使用链表来存储空闲内存地址,这些地址本质上是不连续的,而链表遍历的方向是从低地址到高地址。堆的大小受到计算机系统上可用的虚拟内存的限制。可见堆栈获得的空间更加灵活、更大。
(4)应用效率对比:
堆栈由系统自动分配,速度更快。但程序员无法控制。
Heap是从new分配的内存,一般速度较慢,而且容易产生内存碎片,但使用起来比较方便。
另外,在WINDOWS上,最好的方式是使用VirtualAlloc来分配。内存并不在堆或堆上,而是直接在进程的地址空间中预留部分内存,虽然使用起来比较不方便。但它更快、更灵活。
(5)栈和栈中存储内容
栈:函数调用时,压入栈的第一条指令是主函数之后的下一条指令(函数调用语句的下一条可执行语句))),然后是各个函数参数在大多数C编译器中,参数从右到左压入堆栈,然后是函数中的局部变量。请注意,静态变量不会压入堆栈。
当这个函数调用结束时,先将局部变量从栈中弹出,然后是参数,最后栈顶指针指向第一次保存的地址,即main中的下一条指令function程序从此时继续运行。
堆:一般情况下,堆顶部用一个字节来存储堆大小。堆的具体内容由程序员规定。