白话C++系列(5)-- 内存管理

C++内存管理

变量所占内存的回收方式取决于该变量的存储类型(storage class)

1、如果是在函数内定义的,称为 局部 变量,存储在栈空间内。它的空间会在函数调用结束后自行释放。

2、如果是全局变量,存储在DATA段或者BSS段,它的空间是始终存在的,直至程序结束运行。

3、如果是new或者malloc得到的空间,它存储在HEAP(堆)中,除非手动delete或free,否则空间会一直占用直至进程结束。

什么是内存管理?

思考:内存的本质是什么?---->资源

思考:谁掌管内存资源? ---->操作系统

思考:我们能做什么? ---->申请/归还

申请/归还内存资源就是内存管理

C++中如何进行内存的申请和释放?

申请 --->使用运算符new

释放 --->使用运算符delete

即:

申请内存:int *p = new int;

释放内存: delete p; 这样就申请和释放一个内存或是某一种类型的内存

思考:如何申请和释放块内存呢?

int *arr = new int[10]; //申请了10个整型的块内存

delete []arr; //释放块内存

思考:申请内存是否一定就能申请成功呢?显然,不一定!!

因此,编码时,就要对可能的申请内存失败进行处理

int *p = new int[1000];

if(NULL == p)

{

   //内存分配失败

}

释放内存后,要将相应的指针赋值为空,即

delete p;                   delete []p;

p = NULL;                 p = NULL;

如果将释放后的指针不置为空,那么当前的这个指针还是指向相应的那块内存,如果我们不小心又调用了一次delete,那么就会使得同一块内存被重复回收,一旦被重复回收,计算机就会出现异常。

小结:

1) 使用new申请内存,使用delete释放内存

2) 申请内存时需要判断是否申请成功,释放内存后需要将指针置为空

3) new和delete要配套使用

最后看一个实例:

在堆中申请100个char类型的内存,拷贝Hello imooc字符串到分配的堆中的内存中,打印字符串,最后释放内存。

完整可执行程序:

#include <string.h>
#include <iostream>
using namespace std;
int main(void)
{
    char *str = new char[100];//在堆中申请100个char类型的内存
    strcpy(str, "Hello imooc"); //拷贝Hello C++字符串到分配的堆中的内存中
    cout<<str<<endl;//打印字符串
    delete []str;//释放内存
    str=NULL;
    return 0;
}

文档信息

版权声明:可自由转载(请注明转载出处)-非商用-非衍生

发表时间:2024年10月18日 10:47