c++ 内存管理

目录

一.内存分布

二. C/C++语言中动态内存管理方式

2.1.C:malloc /calloc /realloc /free

2.2.C++内存管理方式 : 通过new和delete操作符进行动态内存管理

三.new和delete的原理

3.1 new和malloc    delete和free

3.2 new的原理

3.3 delete的原理

3.4 new T[N]的原理

3.5delete[]的原理


一.内存分布

1. 栈又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。
2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口
创建共享共享内存,做进程间通信。
3. 用于程序运行时动态内存分配,堆是可以上增长的。
4. 数据段--存储全局数据和静态数据。
5. 代码段--可执行的代码/只读常量


二. C/C++语言中动态内存管理方式

2.1.C:malloc /calloc /realloc /free

2.2.C++内存管理方式 : 通过new和delete操作符进行动态内存管理
 

注意:在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与
free不会!!!


 


三.new和delete的原理
 

3.1 new和malloc    delete和free

1.new和mallocdelete和free 基本类似.

2.不同的地方是:new/delete申请和释放的是单个元素的空间new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常malloc会返回NULL。

new的实现 和 malloc:

void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{
    // try to allocate size bytes
    void *p;
    while ((p = malloc(size)) == 0)
    if (_callnewh(size) == 0)
    {
        // report no memory
        // 如果申请内存失败了,这里会抛出bad_alloc 类型异常
        static const std::bad_alloc nomem;
        _RAISE(nomem);
    }
return (p);
}

delete的实现 和 free:

​
void operator delete(void *pUserData)
{
    _CrtMemBlockHeader * pHead;
    RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));
        if (pUserData == NULL)
            return;
    _mlock(_HEAP_LOCK); /* block other threads */
    __TRY
    /* get a pointer to memory block header */
    pHead = pHdr(pUserData);
    /* verify block type */
    _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));

    //释放空间
    _free_dbg( pUserData, pHead->nBlockUse );

    __FINALLY
    _munlock(_HEAP_LOCK); /* release other threads */
    __END_TRY_FINALLY
        return;
}

​



3.2 new的原理 和 operator new


new :

先调用 operator new 函数申请空间申请的空间上执行构造函数,完成对象的构造。

operator new :

实际也是通过malloc来申请空间,但不会自动调用构造函数.



3.3 delete的原理 和 operator delete

delete : 

在空间上执行析构函数,完成对象中资源的清理工作,调用 operator delete 函数释放对象的空间.

operator delete:

 最终是通过free来释放空间的,但不会自动调用析构函数.



3.4 new T[N]的原理  和 delete[]的原理


1. new T[N]  :先调用operator new[] 函数,在operator new[] 中实际调用 operator new函数完成N 个对象空间的申请,申请的空间上执行N次构造函数


2. delete[] :释放的对象空间上执行N次析构函数,完成N个对象中资源的清理,再调用 operator delete []释放空间 ,实际在operator delete[]中调用operator delete来释放空间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值