zoukankan      html  css  js  c++  java
  • 深入理解C++中的new/delete和malloc/free动态内存管理

    malloc/free和new/delete的区别

    • malloc/free是C/C++标准库的函数;new/delete是C++操作符。
    • malloc/free只是动态分配内存空间/释放空间;new/delete除了分配空间还会调用构造函数和析构函数进行初始化与清理资源。
    • malloc/free需要手动计算类型大小且返回值类型为void*;new/delete可自动计算类型的大小,返回对应类型的指针。
    • malloc/free管理内存失败会返回0;new/delete等的方式管理内存失败会抛出异常。

    在C++ Primer书中有提到说: new/delete的表达式与标准库函数同名了,所以系统并没有重载new或delete表达式。new/delete真正的实现其实是依赖下面这几个内存管理接口的。

    void *operator new(size_t);     //allocate an object
    void *operator delete(void *);    //free an object
    
    void *operator new[](size_t);     //allocate an array
    void *operator delete[](void *);    //free an array
    

    malloc/free和new/delete的底层实现

    new的底层实现

    // new.cpp
    #include <cstdlib>
    #include <new>
    
    _C_LIB_DECL
    int __cdecl _callnewh(size_t size) _THROW1(_STD bad_alloc);
    _END_C_LIB_DECL
    
    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
                            _THROW_NCEE(_XSTD bad_alloc, );
                    }
    
            return (p);
            }
    

    delete的底层实现

    #include <cruntime.h>
    #include <malloc.h>
    #include <new.h>
    #include <windows.h>
    #include <rtcsup.h>
    
    void operator delete( void * p )
    {
        RTCCALLBACK(_RTC_Free_hook, (p, 0));
    
        free( p );
    }
    

    new[]的底层实现

    #include <new>
    
    void *__CRTDECL operator new[](size_t count) _THROW1(std::bad_alloc)
    	{	// try to allocate count bytes for an array
    	return (operator new(count));
    	}
    

    delete[]的底层实现

    #ifdef CRTDLL
    #undef CRTDLL
    #endif
    
    #ifdef MRTDLL
    #undef MRTDLL
    #endif
    
    #define _USE_ANSI_CPP // suppress defaultlib directive for Std C++ Lib
    #include <new>
    
    extern void __CRTDECL operator delete[](void *ptr) _THROW0();
    
    void __CRTDECL operator delete[](void *ptr,
    	const std::nothrow_t&) _THROW0()
    	{	// free an allocated object
    	operator delete[](ptr);
    	}
    

    malloc/free和new/delete的执行过程

    new的执行过程

    new(int size) --> operator new() --> malloc() --> constructor function --> return ptr
    

    delete的执行过程

    delete ptr --> destructor function --> operator delete() --> free
    

    new[]的执行过程

    new[count] --> operator new[]() --> operator new() --> malloc() --> constructor function --> return ptr
    

    delete[]的执行过程

    delete[] ptr --> destructor function --> operator delete[]() --> operator delete() --> free
    
    • 依次调用指针指向对象数组中每个对象的析构函数
    • 调用operator delete[]()operator delete[]()再调用operator delete
    • 底层用free执行operator delete表达式,依次释放内存
    • operator delete[]()数组的个数存放在指针的前4位

    参考

    https://www.cnblogs.com/tp-16b/p/8684298.html

  • 相关阅读:
    机械设计手册
    如何在PADS的封装中做非金属化孔
    【Protle99SE】PCB中各层的含义【小汇】
    Stm32时钟分析
    头文件为什么要加#ifndef #define #endif
    android adb常用指令
    安装 SQLManagementStudio_x86_CHS(SQL Server Management Studio) 老提示重启的解决办法
    SQL 2008下载地址以及全新安装详细过程
    【原创】pads2007 Layout 电气连接性检查过孔显示错误
    十款最具发展前景机器人
  • 原文地址:https://www.cnblogs.com/liutongqing/p/13591093.html
Copyright © 2011-2022 走看看