map迭代器是否会增加shared_ptr引用计数?场景疑问咨询
先把你给出的代码贴出来:
#include <memory> shared_ptr<map<int, int>> ptr1 = make_shared<map<int, int>>(); map<int, int>::const_iterator iter = ptr1->begin(); shared_ptr<map<int, int>> ptr2 = make_shared<map<int, int>>(); ptr1 = ptr2;
问题1:iter是否会增加ptr1原指向对象的引用计数?
答案是不会。
这里的iter是map容器的普通迭代器,它的作用只是指向容器内部的某个元素(这里是map的起始位置),但它并不会持有对整个map对象的shared_ptr引用。shared_ptr的引用计数是专门用来追踪有多少个shared_ptr实例指向同一个堆对象的,只有当你创建新的shared_ptr指向这个map时,计数才会上涨。迭代器根本不参与这个引用计数的管理体系,所以它不会对原对象的引用计数产生任何影响。
问题2:ptr1被赋值为ptr2后,其原指向的内存地址会被释放吗?
这要看原对象的引用计数是否降到0:
- 赋值操作
ptr1 = ptr2会先让ptr1放弃对原map对象的所有权,原对象的引用计数会减1。 - 在你给出的代码场景里,原本只有ptr1这一个shared_ptr指向原map,所以计数减到0之后,这个map对象会被
shared_ptr自动销毁,对应的内存也会被释放。 - 这里要特别注意:此时之前创建的
iter就变成了悬空迭代器,因为它指向的容器已经被销毁了,之后如果再使用这个iter,会触发未定义行为(比如程序崩溃、输出乱码等),一定要避免这种情况。
内容的提问来源于stack exchange,提问作者cwfighter
相关产品推荐
相关产品推荐

