shared_ptr放入vector,要及时clear,避免内存泄漏

最近碰到一个内存泄漏的问题,查了半天发现是vector数组的成员中有共享指针,而vector没有释放引用计数导致的。下面简化一下这个问题,直接看代码:

#include 
#include 
#include 
using namespace std;

int main(){

    shared_ptr a1(new int(1));
    cout << "a1.count=" << a1.use_count() << endl;
    vector> 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 
#include 
#include 
using namespace std;

int main(){

    shared_ptr a1(new int(1));
    cout << "a1.count=" << a1.use_count() << endl;
    vector> 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 
#include 
#include 
using namespace std;

struct A{
    shared_ptr b1;
};

typedef std::shared_ptr 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 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的引用就没有增加。

你可能感兴趣的:(C++小技巧,c++)