2.22学习
1、对于顺序容器(vector,list等)erase时,需要将迭代器--,得到上一个元素位置,而对于关联容器(map,set)erase时,erase()会返回一个迭代器指向上一个元素
对于clear()只能清除所有元素,并不能清除分配的内存,只有deque能实现边删除元素边清除内存
map的[]访问元素,如果元素不存在就会在这个位置插入一个默认值进去,而find()是如果元素不存在就返回end()迭代器
2、对于STL的内存优化问题:一级配置器(大块内存),二级配置器(小块内存)
一级配置器就是对malloc()和free()的封装,效率较低,如果分配较小的内存时(<128字节),除了储存数据的信息还有内存块的信息,所以导致内存比较碎片化
二级配置器目的是把零散的内存块整合在一起,以及不用频繁的调用malloc()和free(),核心是内存池+自由链表
内存池就是分配一大块内存,然后把它依次分成8,16,24……的小块,每个小块封装一个自由链表,然后之后分配内存的时候直接去自由链表中领取,不用再调用malloc(),同样在释放的时候也不会调用free()而是会直接返还内存给内存池

3、对于vector的push_back()可以替换为emplace_back()这样会直接在尾部创建,减少了拷贝和移动
4、智能指针shared_ptr,这种情况会导致构造一个新的智能指针指向p的地址,执行完fun()就会释放,p就为NULL
点击查看代码
void fun(shared_ptr<int> temp)
{
}
int main()
{
int* p = new int(10);
fun(shared_ptr<int>(p));
//
shared_ptr<int> sp1(new int(20));
int* q = sp1.get();//返回一个普通指针,指向shared_ptr所管理的对象
delete q;//释放掉q后,sp1就变成了悬空指针,使用sp1会导致未定义行为
return 0;
}
浙公网安备 33010602011771号