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

最近碰到一个内存泄漏的问题,查了半天发现是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的引用就没有增加。

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值