在我大部分的编程中,有一天,我把所有的东西都放在一个智能指针中,忘了它吧...99.9%的时间对资源进行了适当的管理。它确实比垃圾收集机制更好更好。
但是,偶尔需要显式释放智能指针所持有的资源,然后才能重新分配它的新实例。就像这样:
r = std::make_shared<my_resource>(with_this_id);
r->do_work();
...
r->do_more_work();
...
r->do_even_more_work();
r.reset();
r = std::make_shared<my_resource>(with_this_id);
如果我错过了r->reset()调用时,资源可能正在使用大量内存或磁盘空间,重新分配而不首先重置可能会在较小的计算机上造成问题。或者是资源被锁定,以便在显式释放之前不能重新分配。
是否有一种模式/算法/某种东西以更干净的方式处理这种情况?
根本上是构造和析构的顺序问题。 r = std::make_shared<my_resource>(with_this_id); 语法上,一定是先执行右边的构造,然后对r进行赋值,赋值后原资源没有owner于是被析构。
所以要解决这个问题只能调整新资源的构造和原资源的析构顺序。 一是提前手动reset原资源; 二是提供一层封装,在封装函数里完成reset及make_shared操作。 但第二种方法使用起来也不是那么自然。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。