c – 共享指针双删除
发布时间:2020-12-16 10:09:42 所属栏目:百科 来源:网络整理
导读:我有一个显然被双重删除的对象,尽管被智能指针跟踪.我是新手使用智能指针所以我做了一个简单的函数来测试我是否正确使用了对象. int *a = new int(2);std::shared_ptrint b(a);std::shared_ptrint c(a); 主函数中的这组行导致运行时错误,因为指针超出范围,为
我有一个显然被双重删除的对象,尽管被智能指针跟踪.我是新手使用智能指针所以我做了一个简单的函数来测试我是否正确使用了对象.
int *a = new int(2); std::shared_ptr<int> b(a); std::shared_ptr<int> c(a); 主函数中的这组行导致运行时错误,因为指针超出范围,为什么?智能指针是不是应该能够自己处理删除? 解决方法
shared_ptr期望拥有指向的对象.
你所做的就是创建两个独立的智能指针,每个指针都认为它拥有底层int的独占所有权.他们不了解彼此的存在,他们不会互相交谈.因此,当它们超出范围时,两个指针都会删除底层资源,结果显而易见. 创建shared_ptr时,它会创建一种“管理对象”,负责资源的生命周期.复制shared_ptr时,两个副本都引用相同的管理对象.管理对象会跟踪指向此资源的shared_ptr实例的数量. int *本身没有这样的“管理对象”,因此复制它不会跟踪引用. 这是对代码的最小重写: // incidentally,"make_shared" is the best way to do this,but I'll leave your // original code intact for now. int *a = new int(2); std::shared_ptr<int> b(a); std::shared_ptr<int> c = b; 现在,它们都引用相同的底层管理对象.当每个shared_ptr被销毁时,int *上的引用数量减少,并且当最后一个引用进入时,对象将被删除. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |