动态内存简单总结(上)

①什么是动态内存

      动态内存是相对静态内存而言的。所谓的动态和静态就是指内存的分配方式。动态内存指的是在堆上分配的内存,而静态内存指的是在栈上分配的内存。

      一般我们定义的局部变量,形参,函数调用等,都是在栈上的静态内存分布。在Windows系统中默认大小为1M,内存比较有限,所以在执行复合语句或函数运行结束后,就会被系统自动回收和释放

      堆区的内存是由程序员手动分配和释放的。在程序运行时的过程中,程序员可以在堆区动态地带请求一定大小的内存,并在用完后进行释放。而这种需要大块内存或程序在运行中才知道所需内存的具体大小,所以我们需要动态存储在内存空间大的堆区中。

②动态内存分配函数

分配:malloc     calloc     realloc         释放内存:free

注:动态内存申请后,一定要由程序员手动释放空间(free),只要程序员不手动编程释放,就算函数运行结束,动态分配的内存空间也不会被释放,其他函数仍可继续使用它。除非是整个程序运行结束,这时系统为该程序分配的所有内存空间都会被释放。

③malloc的使用

malloc(memory allocate)函数的功能就是内存分配,是指向堆区中申请一块指定大小的连续内存空间,要调用它必须要包含头文件<stdlib.h>

这是malloc的原型:

#include<stdlib.h>

typedef unsigned int size_t;

void*malloc(size_t);

malloc 函数只有一个无符号整型形参。该函数指的是在堆区中分配一个长度为size的连续空间

函数的返回值是一个指向所分配内存空间起始地址的指针,类型为 void*型。

即只能拿地址,不能执行指针+1的能力。

在这里举一些malloc实际应用的例子:

#include<stdlib.h>
​
int *parr = (int*)malloc(100);

char *pbrr = (char*)malloc(100);

在这个实例中:

第一条指令:请求系统分配 100 字节的内存空间,并返回第一字节的地址,然后赋给指针变量 parr。此时在这块申请的内存上,我们可以存储25个整型数据即,                                                                      存储数据个数 = 申请字节大小 / sizeof(类型) 

第二条指令:请求系统分配 100 字节的内存空间,并返回第一字节的地址,然后赋给指针变量 pbrr。此时在这块申请的内存上,我们可以存储100个字符型数据。

④free函数的调用

free用来释放从malloc,realloc,calloc成功获取到的在堆区上的内存分配空间。

这是free函数的原型:

#include<stdlib.h>

void free(void* ptr);

free 函数无返回值,它的功能是释放指针变量 ptr 所指向的堆上的内存单元。此时 ptr 所指向的那块内存单元将会被释放并还给操作系统,操作系统可以重新将它占据的内存分配给其他变量使用。

如果不释放的话,由动态内存函数开辟的空间会一直存在,知道整个程序结束,但如果是大型服务器长期运行不结束时,会在堆区上一直累积无法被找到的内存,导致内存空间不够,发生卡顿等问题,所以动态内存开辟后的空间一定要进行释放。

正常使用malloc开辟后用free函数释放的简单举例:

#include<stdlib.h>
#include<stdio.h>
#include<string.h>

int main(){
   int num;
   scanf("%d",&num);
   int *p = (int*)malloc(num*sizeof(int));//堆动态开辟内存
   assert(p != nullptr);//判断内存是否开辟成功
   for(int i = 0 ;i < num ; i++){
      p[i] = 0;//内存初始化
   }
   free(p);//释放开辟空间
   return 0;
}

free在使用不当时,会出现崩溃:

   1.释放栈内存,即释放在栈上开辟的空间,在该文章开头叙述过,我们定义的局部变量,形参,函数调用等,都是在栈上的静态内存分布。如果我们操作不当,将free用于释放栈内存,将会造成崩溃。

   2.多次释放也会崩溃,即已经释放过动态开辟的内存后,再次使用free释放,会造成崩溃。

   3.动态开辟的内存 指针指向内存头部,如果指向头部的指针发生移动后,没有移动回原位置,此时用free释放只能释放移动后头部指针指向的位置即以后的内存,会造成崩溃。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值