c/c++语言开发共享C++全面覆盖内存管理知识讲解

前言c语言内存管理方式在c++中可以继续使用,但有些地方就无能为力而且使用起来比较麻烦,因此c++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。一、c++内存管理方式1.

前言

c语言内存管理方式在c++中可以继续使用,但有些地方就无能为力而且使用起来比较麻烦,因此c++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理。

一、c++内存管理方式

1.1new/delete操作内置类型

void test()  {  // 动态申请一个int类型的空间  int* ptr4 = new int;  // 动态申请一个int类型的空间并初始化为10  int* ptr5 = new int(10);  // 动态申请10个int类型的空间  int* ptr6 = new int[3];  delete ptr4;  delete ptr5;  delete[] ptr6;  }  

C++全面覆盖内存管理知识讲解

注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用new[]和delete[]

二、operator new与operator delete函数

2.1operator new与operator delete函数

new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。

/*  operator new:该函数实际通过malloc来申请空间,当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);  }  /*  operator 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;  }  /*  free的实现  */  #define free(p) _free_dbg(p, _normal_block)  

通过上述两个全局函数的实现知道,operator new 实际也是通过malloc来申请空间,如果malloc申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常。operator delete 最终是通过free来释放空间的。

二、new和delete的实现原理

2.1内置类型

如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回null。

2.2 自定义类型

new的原理

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

delete的原理

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

new t[n]的原理

  • 调用operator new[]函数,在operator new[]中实际调用operator new函数完成n个对象空间的申请
  • 在申请的空间上执行n次构造函数

delete[]的原理

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

到此这篇关于c++全面覆盖内存管理知识讲解的文章就介绍到这了,更多相关c++内存管理内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!

需要了解更多c/c++开发分享C++全面覆盖内存管理知识讲解,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/1237787.html

(0)
上一篇 2022年9月10日
下一篇 2022年9月10日

精彩推荐