代码改变世界

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

2016-04-09 21:38  Keiven_LY  阅读(814)  评论(0编辑  收藏  举报

C++内存管理

什么是内存管理?

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

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

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

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

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;
}