C++内存管理

首先有几点综述:

1. 内存的本质是资源

2. 操作系统在掌管内存

3. 程序员能做的就是对内存进行申请和归还


申请和释放内存分别用到运算符:new(申请)和delete(释放)。

申请的方法:

//申请一个内存
int *p=new int;//申请内存
delete p;//释放内存

申请块内存的方法:

//申请和释放块内存
int *arr=new int[10];//申请10个整型的内存空间
delete []arr;//释放内存块

C语言中的内存申请和释放,用的是malloc函数。

void *malloc(size_t size);
void free(void *memblock);
如果在编程中,用new申请了内存,那就要用delete释放,用malloc申请就要用free来释放。

在申请时,实际上不一定是能够申请成功的,因为可能内存当时已经分配完了,我们要预见这种情况。

//申请失败时有反馈
int *p=new int[1000];

if(Null==p)
{
	//内存分配失败	
}

值得一说的是用Null==p这种语言风格更好,因为一不小心打成Null=p时,系统会报错,能预防一些错误。


那么,在释放内存时需要注意什么,

int *P=new int;
if(NULL==p)
{
	//内存分配失败
	//异常处理
}
delete p;
p=NULL;


int *p=new int p[1000];
if(NULL==p)
{
	//内存分配失败
	//异常处理
}
delete [p];
p=NULL;
即使申请失败内存,也要讲指针想申请的内存释放掉,并将其置空,避免重复回收等异常情况。

课后练习中,完成的作业能通过系统验证,但在VS2013中,却无法通过编译,代码如下:

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

using namespace std;

int main()
{
	//在堆中申请100个char类型的内存
	char *str = new char[100];
	//拷贝Hello C++字符串到分配的堆中的内存中
	strcpy(str, "Hello imooc");
	//打印字符串
	cout <<str<< endl;
		//释放内存
	delete[]str;
	str = NULL;

	system("pause");
	return 0;
}


这是因为strcpy的安全性较低,微软在编译器中弃用了这个函数,用strcpy_s代替。如果坚持用的话,可以在int main()上一行添加西面代码:

#pragma warning(disable:4996);


即可编译通过。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值