7.9面试问题
内存碎片是什么?
堆内存碎片,我们new的时候是连续申请内存的,举个例子
比如我们连续申请了8,16,8,4,字节的内存,然后我们删除了中间第三个8字节的内存,之后需要插入24字节的数据,明显,最后的4字节,或者8字节都放不下
于是我们只能在4字节的内存后再申请24字节的内存,这样前面的4字节和8字节就被浪费掉了
那我们也可以把之前的16字节内存释放掉,然后把这个24字节的数据插入进去,这样就没有浪费了
上面这些我们一般称为外部碎片
而内部碎片则是我要申请5字节的内存,但是系统由于内存对齐原则往往会申请8字节,这样剩下的3字节就会被浪费掉了
而这种浪费掉的中间内存就是内存碎片
我们可以提前开辟一个较大的空间或者减少new和delete来减少这种情况的发生
对于一些容器,我们也可以用std::pmr::unsynchronized_pool_resource pool(C++17),具体应用如下
点击查看代码
#include <memory_resource>
std::pmr::unsynchronized_pool_resource pool;
std::pmr::vector<int> values(&pool);
在Qt中内存碎片的场景比如这样:你创建了几个控件(都继承了QObject),但是这几个控件中写了几个子控件,但是子控件你自己手动delete了,因为每个子控件的内存是不同的
所以手动delete后就会出现内存碎片
或者控件中有一些字符串或者图片,操作他们的时候可能会造成内存碎片
因为Qt中所有控件都是继承对象树的,最后对象树不用手动delete,它会自动释放,所以释放后会出现一大片连续的空白内存,所以我们的子控件尽量不要手动delete
而Qt中对象树和继承树的区别?
类继承树是编译期的树,它规定整个控件都是继承QObject类
而对象树管理着他们的内存,是在运行时管理new出来的控件的父子关系的,是负责delete回收内存的
浙公网安备 33010602011771号