C/C++内存管理

首先来看一下C/C++中内存的分布

栈区:又称作堆栈,非静态局部变量,函数参数,返回值都是保存在栈区的,函数栈帧的建立也是在栈区的

一般栈区的大小只有十几M

堆区:用于动态内存分配的区域,在C语言中我们通过malloc申请出来的就是堆上的空间,堆区比较大32位的平台下一般是2个G左右。

数据段:存放静态数据和全局数据的。

代码段:存放可执行的代码和只读常量。

 

了解完内存的分布接下来我们来了解内存的管理方式

在C语言中内存的管理方式是通过两个函数  malloc 和 free搭配使用

而C++中则是两个操作符 new 和 delete 搭配使用

我们看看new 和 delete的使用方法

   int *ptr = new int;
   int *ptr2 = (int *)malloc(sizeof(int));
   delete ptr;
   free(ptr2);

可以看出new比malloc更简洁因为我们不用自己去计算类型大小,编译器会帮我们完成。

而malloc相比就比较麻烦一点。

new的优势不仅仅如何。new还可以申请空间并进行初始化

内置类型:

        int *ptr1 = new int; //申请一个大小为int的空间
	int *ptr2 = new int(10);//申请一个大小为int的空间并初始化为10
	int *ptr3 = new int[10];//申请十个大小为int的空间
	delete ptr1;
	delete ptr2;
	delete[] ptr3;

我们可以看到new不仅可以为我们申请空间还能对我们的空间进行初始化,这一点是malloc做不到的。

自定义类型:

class Test
{
public:
	Test() :m_day(0)
	{
		cout << "Test" << endl;
	}
	~Test()
	{
		cout << "~Test" << endl;
	}
private:
	int m_day;
};
int main()
{
	Test* t1 = new Test;
	delete t1;
	return 0;
}

 

class Test
{
public:
	Test() :m_day(0)
	{
		cout << "Test" << endl;
	}
	~Test()
	{
		cout << "~Test" << endl;
	}
private:
	int m_day;
};
int main()
{
	Test* t1 = (Test*)malloc(sizeof(Test));
	free(t1);
	return 0;
}

 

 

通过程序的结果我们发现了new和delete分别调用了我们的构造函数和析构函数。而malloc和free却没有

这就是自定义类型的差别,我们可以通过new调用构造函数来对我们的空间进行初始化,而malloc却做不到。

 

接下来我们说一下new和delete的过程。

new和delete虽然是两个操作符但底层确实他们通过调用operator new和operator delete这两个系统定义的全局函数。

这里的operator并不是运算的重载,希望大家不要混淆

而operator new 和 operator delete又是通过调用malloc和free来实现空间的申请,但不同的是malloc申请失败会返回0

而operator new失败则会抛出异常,但我们一般是看不到的需要我们通过捕获得到异常信息,这里就不一 一 赘述

假如申请和成功然后new还会调用构造函数,释放空间前delete还会调用析构函数对空间进行打扫

我们可以理解成下面这样的关系:

new Test=>operator new 开空间 => malloc => 构造

malloc Test =>malloc

内置类型的话new和malloc效果一样,但是对于自定义类型,new开空间时会自动调用构造函数(完成初始化)

delete还会调用析构函数完成清理。

operator new = (malloc+失败抛异常)

operator delete = free

 

最后我们将new delete和 malloc free的区别进行总结  

1. malloc和free是函数,new和delete是操作符

2. malloc申请的空间不能初始化,new可以初始化

3. malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可

4. malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型

5. malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常

6. malloc/free只能申请内置类型的空间,不能申请自定义类型的空间,因为其不会调用构造与析构函数,

而new可以,new在申请空间后会调用构造函数完成对象的构造,delete在释放空间前会调用析构函数

完成空间中资源的清理

7. new/delete比malloc和free的效率稍微低点,因为new/delete的底层封装了malloc/free

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值