深入理解C++中的new/delete和malloc/free动态内存管理及区别介绍

 更新时间:2020年09月01日 08:24:59   作者:tongqingliu  
这篇文章主要介绍了深入理解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.jb51.net/article/161885.htm

总结

到此这篇关于深入理解C++中的new/delete和malloc/free动态内存管理的文章就介绍到这了,更多相关C++中的new/delete和malloc/free动态内存管理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于QT实现简单的闹钟

    基于QT实现简单的闹钟

    这篇文章主要为大家详细介绍了如何基于QT实现一个简单的闹钟小程序,文中的示例代码讲解详细,具有一定的学习价值,有需要的小伙伴可以参考一下
    2025-02-02
  • C/C++字符串与数字互转的实现

    C/C++字符串与数字互转的实现

    这篇文章主要介绍了C/C++字符串与数字互转的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • C++知识点之inline函数、回调函数和普通函数

    C++知识点之inline函数、回调函数和普通函数

    这篇文章主要给大家介绍了关于C++知识点之inline函数、回调函数和普通函数的相关使用方法,以及回调函数和普通函数的区别小结,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-07-07
  • 解决C++中重定义的方法总结

    解决C++中重定义的方法总结

    本篇文章是对C++中重定义的解决方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言深入探索递归的特点

    C语言深入探索递归的特点

    程序调⽤⾃⾝的编程技巧称为递归 recursion)函数⾃⼰调⽤⾃⼰就是递归,你也可以理解成是⼀种嵌套结构,但递归分为俩部分,第⼀是“递”,进⼊嵌套结构。第⼆是”归“,最终会⼀步⼀步返回。第⼀次接触递归都会很懵,慢慢理解这个过程就明⽩了
    2022-06-06
  • C语言中初始、增加和删除进程信号的操作方法简介

    C语言中初始、增加和删除进程信号的操作方法简介

    这篇文章主要介绍了C语言中初始、增加和删除进程信号的操作方法简介,分别是sigemptyset函数、sigaddset函数和sigdelset函数的用法,需要的朋友可以参考下
    2015-09-09
  • c语言printf实现同一位置打印输出的实例

    c语言printf实现同一位置打印输出的实例

    下面小编就为大家带来一篇c语言printf实现同一位置打印输出的实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • C语言数据结构链表队列的实现

    C语言数据结构链表队列的实现

    这篇文章主要介绍了C语言数据结构链表队列的实现的相关资料,需要的朋友可以参考下
    2017-07-07
  • C++堆排序算法实例详解

    C++堆排序算法实例详解

    这篇文章主要介绍了C++堆排序算法,简单分析了堆排序算法的原理并结合实例形式分析了C++实现堆排序的具体操作技巧,需要的朋友可以参考下
    2017-08-08
  • C++实现不能被继承的类实例分析

    C++实现不能被继承的类实例分析

    这篇文章主要介绍了C++实现不能被继承的类实例分析,对于C++初学者而言可以通过本文实例更好的理解类的原理及运用,需要的朋友可以参考下
    2014-08-08

最新评论