今天给大家说下内存分布,我们都知道的是,像局部变量都在栈区,但是像我们自己有时候申请的空间都在堆区,当然,内存分布不只只是栈区和堆区,还有常量区,代码区等等。如下图:
这就是内存大概得分布,我们要知道的是,其实就能4G的内存来说,用户空间总共占用3G,内核空间总共占用1G。
而对于C语言来说,像malloc,realloc等函数,申请的空间在堆区,但是不会初始化数据,像calloc会初始化数据,但是在C++中,new是一个关键字,没错,他不是一个函数,他是一个关键字。它在申请自定义类型的时候,会自动调用构造函数,也就是说,他会初始化数据。C语言中的free这个函数是释放空间的,而有些时候我们动态申请的在定义类型的时候,我们要是在释放这个申请的自定义类型的时候,如果这个自定义类型的内部如果要是还有动态申请的空间,此时就会造成内存泄漏。而C++中的delete关键字,他会和new一样,会自动调用这个自定义类型的析构函数。
那么,神秘的new,delete到底是怎么实现的呢?我们来看看下面的这个代码:
#include <iostream>
using namespace std;
class Date
{
public:
Date()
: day(0)
, month(0)
, year(0)
{}
~Date()
{
day=month=year=1;
}
private:
int day;
int month;
int year;
};
int main()
{
Date* p=new Date;
delete p;
return 0;
}
先来看看new到底是如何实现的,如下:
我们可以看到的是,new其实是底层调用了operator new这个函数,然后开辟空间用的还是malloc,所以,变来变去底层用的还是malloc。然后调用完operator new这个函数,又会自动调用我们定义的Date这个类的构造函数。而delete基本也是这个原理如下:
这就是delete的底层原理,他会先调用析构函数清理空间,然后在调用operator delete 函数来释放空间,而其实说白了,operator delete 底层也是free这个函数释放空间,只不过是条件编译等等,看起来很复杂,我们虽然看不懂汇编代码,但是看个大概意思猜一下就出来了。
以上就是本篇所有的内容了,如果有收获的话,希望点一下赞把!