开发者社区> 问答> 正文

在分配新版本的资源时,在C++中处理复杂资源指针的做法是什么?

在我大部分的编程中,有一天,我把所有的东西都放在一个智能指针中,忘了它吧...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()调用时,资源可能正在使用大量内存或磁盘空间,重新分配而不首先重置可能会在较小的计算机上造成问题。或者是资源被锁定,以便在显式释放之前不能重新分配。

是否有一种模式/算法/某种东西以更干净的方式处理这种情况?

展开
收起
aqal5zs3gkqgc 2019-12-20 10:15:47 2792 0
1 条回答
写回答
取消 提交回答
  • 根本上是构造和析构的顺序问题。 r = std::make_shared<my_resource>(with_this_id); 语法上,一定是先执行右边的构造,然后对r进行赋值,赋值后原资源没有owner于是被析构。

    所以要解决这个问题只能调整新资源的构造和原资源的析构顺序。 一是提前手动reset原资源; 二是提供一层封装,在封装函数里完成reset及make_shared操作。 但第二种方法使用起来也不是那么自然。

    2020-03-20 13:36:54
    赞同 展开评论 打赏
问答分类:
C++
问答地址:
问答排行榜
最热
最新

相关电子书

更多
使用C++11开发PHP7扩展 立即下载
GPON Class C++ SFP O;T Transce 立即下载
GPON Class C++ SFP OLT Transce 立即下载