白话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