C/C++:动态内存管理详解戳这里

C/C++程序的内存开辟
C/C++:动态内存管理详解戳这里_第1张图片
分配方式
1.从静态存储区域分配。内存在程序编译的时候就已经分配好,在程序整个运行期间都存在,例如:全局变量、static变量。静态分配区域的生命周期是代码的整个运行期,当代码终止运行后,这块内存才会被系统回收。
2.在栈上创建。在执行函数时,函数内局部变量的存储单元可以在栈上开辟创建,但在函数执行过程中会被自动释放。如果是在函数中定义的局部变量,则生命周期就是函数被调用的过程。
3.在堆中进行分配。也称为动态内存分配(由程序员进行申请和释放)

动态内存分配

我们曾经学习过两种动态内存的开辟方式:

int  value = 20;//在栈空间中开辟了四个字节
char arr[10] = {
   0};//在栈空间上开辟了10个字节的连续空间

上面的开辟空间方式有两种:

  1. 开辟固定大小的空间
  2. 数组在声明的时候,必须指定数组的长度,数组是在栈上开辟空间,它所需要的内存在编译时自动分配(数组不能定义未知的一个变量)

但对于空间的需求,有时候我们需要的空间大小在程序运行时才知道,但数组的编译时开辟空间的方式就不能满足了,此时就需要动态内存开辟。

动态内存函数的介绍

malloc和free

C语言提供了一个动态内存开辟的函数:

void* malloc(size_t size);

这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。

  • 如果开辟成功,则返回一个指向开辟好空间的指针;
  • 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。
  • 返回值的类型是void*,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。
  • 如果参数size为0,malloc的行为是标准未定义的,取决于编译器

C语言提供了一个另外一个函数free,专门用来做动态内存的释放和回收的,函数的声明如下:

viod free(void* ptr);

free函数用来释放动态开辟的内存

  • 如果参数ptr指向的空间不是动态开辟的,free函数的行为是未定义的
  • 如果参数ptr是NULL指针,则函数不需要执行操作

说明:
1.free和malloc缺一不可,他们成对出现;
2.malloc函数在使用时,如果不使用free释放,,就会出现内存泄露的情况
3.当实际情况远远大于期望设置空间,free函数并没有告知要释放多少字节的信息;
4.free传进来的是起始地址,但未设置要释放多少,而释放前后的地址没有变,释放后指针和内存关系是没有关联的;
5.free不需要清空它的内存空间(这样是为了提高计算机的效率);
6.free没有告知要释放多少空间,但malloc会保存要释放多少字节的信息;
7.malloc和free 函数声明都包括在stdlib.h头文件中
8.在代码编写过程中,要注意将指针设置为空,以免出现非法指向变成野指针;

申请动态内存:

//申请动态内存
	int  n = 30;
	char *name = (

你可能感兴趣的:(C++,C语言)