前言
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; }
注意:申请和释放单个元素的空间,使用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