C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 共享指针双删除大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个显然被双重删除的对象,尽管被智能指针跟踪.我是新手使用智能指针所以我做了一个简单的函数来测试我是否正确使用了对象.

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 *上的引用数量减少,并且当最后一个引用进入时,对象将被删除.

大佬总结

以上是大佬教程为你收集整理的c – 共享指针双删除全部内容,希望文章能够帮你解决c – 共享指针双删除所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。