最近碰到一个内存泄漏的问题,查了半天发现是vector数组的成员中有共享指针,而vector没有释放引用计数导致的。下面简化一下这个问题,直接看代码:
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
int main(){
shared_ptr<int> a1(new int(1));
cout << "a1.count=" << a1.use_count() << endl;
vector<shared_ptr<int>> v1;
v1.push_back(a1);
cout << "a1.count=" << a1.use_count() << endl;
return 0;
}
运行结果为:
a1.count=1
a1.count=2
可以看到,因为使用了vector而没有清空,增加了智能指针的引用次数,但是在使用完vector之后没有释放,到时计数没有回归。这时候,应该及时将vector清空,特别是这个vector不是一个临时的局部变量时,在使用完成后一定要及时clear,不然回造成内存泄漏。
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
int main(){
shared_ptr<int> a1(new int(1));
cout << "a1.count=" << a1.use_count() << endl;
vector<shared_ptr<int>> v1;
v1.push_back(a1);
cout << "a1.count=" << a1.use_count() << endl;
v1.clear();
cout << "a1.count=" << a1.use_count() << endl;
return 0;
}
运行结果为:
a1.count=1
a1.count=2
a1.count=1
这里我们来引深一下,为什么放入Vector之后,智能指针的计数会增加呢。因为放入vector之后,相当于多了一个指针可以指向new出来的内存,所以引用计数会增加。我们看看嵌套一个结构体,结构体里也有一个共享指针会如何。
#include <iostream>
#include <memory>
#include <vector>
using namespace std;
struct A{
shared_ptr<int> b1;
};
typedef std::shared_ptr<A> APtr;
int main(){
APtr a1(new A());
a1->b1.reset(new int(1));
cout << "a1.count=" << a1.use_count() << endl;
cout << "A.b1.count=" << a1->b1.use_count() << endl;
vector<APtr> v1;
v1.push_back(a1);
cout << "a1.count=" << a1.use_count() << endl;
cout << "A.b1.count=" << a1->b1.use_count() << endl;
v1.clear();
cout << "a1.count=" << a1.use_count() << endl;
cout << "A.b1.count=" << a1->b1.use_count() << endl;
return 0;
}
运行结果为:
a1.count=1
A.b1.count=1
a1.count=2
A.b1.count=1
a1.count=1
A.b1.count=1
这里可以看到,结构体里的共享指针b1的计数一直是1,那是因为被放入vector的是一个指针,指针指向的内存里才有b1,而这个内存地址始终没变,b1的引用就没有增加。