C++内存分配理解一

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wjh_init/article/details/80539425

内存分配

一般我们在使用C++来创建一个内置对象或者一个类的时候。一般都没有想过底层是怎样去实现的。本文是根据侯捷的视频进行的一部分总结,只考虑堆上的分配。

首先来看一张图
基本描述

其实根据这张图我们可以去了解到C++基本内存分配规则了。在不考虑OS API的影响下,一切都是基于C语言当中的malloc/free来进行内存的分配和回收的。

现在再来进一步看一下各个函数:
这里写图片描述

接下来在看一下具体应用:
展示了一些用法,其实都不重要。
这里写图片描述

new的解剖

这里写图片描述
1进行operator new调用分配内存
2一个强制转换
3调用构造函数,但注意。不是所有环境都支持直接调用,一般是给编译器处理

operator new

这里写图片描述
这个函数是不抛异常的,分配到了内存就返回,不然就调用_callnewh(vc环境下)
_callnewh作用:调用一个你准备的函数,用于在你内存不够malloc的时候有机会释放一部分内存,在下一次循环的时候可以malloc到内存。

delete的解析

相应的delete和new原理相似
这里写图片描述
一样的,当调用delete的时候,先对对象进行析构(这个是可以直接调用的),在通过operator delete进行释放,而operator delete中呢,就是简单的调用了free。

new/new[]和delete/delete[]

先来看两张图
这里写图片描述
这里写图片描述

在我们进行new的时候当new的是一个数组的时候,内存块中会有一块存放整个数组大小的cookie,用于释放。
如图,使用delete当释放基本类型的时候由于析构函数没有意义,所以加不加[]都无所谓,而当使用类对象的时候,并且析构函数有意义的时候(例如释放一些申请的内存,在我的环境下测试时,显示的给出了析构函数就不行)。如下两张图:
因为这时会在内存块钱加一个对象数量值。若还是以delete去释放就不会正确的找到有几个对象,在我的vs环境下还会报错。
这里写图片描述
这里写图片描述

placement new

这个其实是在已经分配好的内存上进行的操作,下图给出的是一般的使用形式。
这里写图片描述
来看一下Complex* pc = new(buf)Complex(1,2)的编译器解析
这样一看,其实还是调用的是operator new(size _t,void* loc),当这样调用的时候,函数直接返回传入的loc
这里写图片描述

展开阅读全文

没有更多推荐了,返回首页