内存分布(以及new,delete)

今天给大家说下内存分布,我们都知道的是,像局部变量都在栈区,但是像我们自己有时候申请的空间都在堆区,当然,内存分布不只只是栈区和堆区,还有常量区,代码区等等。如下图:

 这就是内存大概得分布,我们要知道的是,其实就能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这个函数释放空间,只不过是条件编译等等,看起来很复杂,我们虽然看不懂汇编代码,但是看个大概意思猜一下就出来了。

以上就是本篇所有的内容了,如果有收获的话,希望点一下赞把!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值