根据侯捷老师的视频:https://www.bilibili.com/video/BV1Kb411B7N8
这篇文章归纳内存管理的面试题和一些知识点梳理
正在更新中
首先为什么想要内存管理
不知道有没有人好奇delete[]或者delete的时候为什么系统会自动这个变量 占了多少字节。
答案是因为cookies,每次内存获取的时候,系统都会额外分配4个字节的cookies用来标注这次分配内存会占用多少内存空间。
如图:
分配了长度为10的int数组,他在调用函数sizeof()的时候是占用了40字节,可是实际上在内存中占用了96字节。(42+32+40+4+12=96)42是(其中上下白色框61h换算十进制是97) cookies,记载这个变量占据的具体字节,32不知道是什么 ,40是用户希望分配的内存,4,是分配的数量,这里是10个int,delete[]会读取这里面的信息正确回收内存,12是系统分配内存为了凑出64的倍数。
这里调用delete可以回收全部的内存吗?
下图是《c++primer》这书中原文,但是根据new和delete的底层代码,这个说法是不全面的。
答案应该是有时候可以,因为int这里的析构函数没有意义,如果是其他object,析构函数有意义就不行。
这里直接调用delete可以回收pca,不能回收psa。
怎么理解
psa里面是string,有指针指向其他分配的地址,析构函数回收指针指向的地址。
可以理解为默认析构函数可以解决的内存管理都可以当做没用呢~
看到一篇文章是这样解释的:https://blog.csdn.net/chenjiayi_yun/article/details/22288805
在下一篇文章中我将讲一下malloc的模型,让大家更好理解
图中代码通过重载operation new,打印了size
不过mac的内存模型还是很奇怪,不加析构函数差了8个字节
c++管理内存使用new和delete,c用free和malloc。
转载:https://blog.csdn.net/qq_38282803/article/details/81462713?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-1&spm=1001.2101.3001.4242
不过我觉得下列回答有些问题,请看内存管理(2)
侯捷老师说的内存管理三把大刀
- 普通的new------new
- array new----new object[]
- replacement new----new()
要想接管c++的内存管理得重载operation new 和operation delete,当然最终还是调用malloc和free向系统获取,回收内存。
这里是示例
Foo类重载了4个紫色的函数,而函数内部仍然调用malloc和free。
为什么重载这四个函数可以接管这个类的内存管理呢?
c++的内存调度顺序是,new调用operation new,operation new调用malloc,其中能重载的只有operation new。
- C++内存分区?
内存泄漏如何定位?栈会发生内存泄漏吗? 内存泄漏和内存溢出的区别?- delete[]怎么知道要调用多少次析构函数
- delete 删除数组为什么会造成内存泄露?
- delete 和 delete[] 有什么区别
C++ 内存模型Cpp 类对象的内存分布- 内存对齐
C++程序崩溃申请的内存会释放吗- 为什么要数据对齐
- new和malloc区别
下列来自腾讯面试题,内存管理考的很少,都是考对象模型
答案----------------------------------
12. 图1
内存泄漏如何定位:https://blog.csdn.net/mfcing/article/details/42673393
- 在析构函数中输出测试代码就可以了。随便提一下new[]的时候是一索引顺在这里插入图片描述
序构造,delete[]是逆序析构。 - 问题不严谨,不是delete所有数组都会导致内存泄漏的,如果这个数组中的对象析构函数是没有意义的,如int,double这种就不会导致内存泄漏,泄漏的原因是只调用一次析构函数。当然只要是分配数组的内存最后都加上delete [],这是代码规范。
- delete调用一次析构函数,delete[]调用多次