加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c 11 – 无法删除shared_ptr泄漏的递归解析代码

发布时间:2020-12-16 07:12:11 所属栏目:百科 来源:网络整理
导读:我在我的生产代码中广泛使用shared_ptrs主要是为了降低复杂性和维护,它通常工作正常.但是,我为复杂的元语法编写了一个解析器,在退出时保留共享对象.其中一个罪魁祸首是由递归引起的.由于解析代码本身很复杂,所以每次下降到下一级时我都想重用它.因此,我在执
我在我的生产代码中广泛使用shared_ptrs主要是为了降低复杂性和维护,它通常工作正常.但是,我为复杂的元语法编写了一个解析器,在退出时保留共享对象.其中一个罪魁祸首是由递归引起的.由于解析代码本身很复杂,所以每次下降到下一级时我都想重用它.因此,我在执行后代解析时保存其父元素中的当前元素.但这导致了太多剩余的强力裁判的问题.我已尝试使用弱存储和强存储,而TreeVect使用weak_ptrs,但父分配问题仍然存在.我的问题是,如何摆脱在下面的父语句赋值中添加的第二个强引用?这是代码,说明我的问题:

#include "stdafx.h"
#include <memory>
#include <vector>

struct Tree;
typedef std::weak_ptr< Tree > TreeWptr;
typedef std::shared_ptr< Tree > TreeSptr;
typedef std::vector< TreeWptr > TreeVect;

struct Tree
{
  TreeVect treeVect;
  //TreeSptr parent;
  TreeWptr parent; // changed from strong to weak ptr
};

struct Element1 : public Tree
{
};

struct Element2 : public Tree
{
};


int main()
{
  TreeSptr element1 = std::make_shared< Element1 >();
  TreeSptr element2 = std::make_shared< Element2 >();
  //element2->parent = element1; // illustrates recursive case.  ERROR: Adds extra strong ref to element1
  //element2->parent->treeVect.push_back( element2 );
  element2->parent = element1; // no longer adds extra strong ref to element1
  element2->parent.lock()->treeVect.push_back( element2 );

    return 0;
}

注意:我通过将父成员从shared_ptr更改为weak_ptr来解决此示例程序的问题.

解决方法

没有人对我正在做的事情进行实质性的权衡,所以我应用了迄今为止我所知道的关于智能指针的内容:永远不会超出范围,不止一个强大的参考对象或它不会破坏.现在似乎很明显.

使用SHARED_PTR实现我的回归分析的结果

成功!仅供参考,以下是我用于解决问题的做法:

1)开始编程项目一般不考虑使用弱ptrs.让一切共享ptr.您需要立即注意解决手头的项目而不要分心.也就是说,在完成之前不要尝试优化.由于ptr逻辑,这使您免于设计代码奇怪.顺便说一句,下次你将在所有权属性上更好地估计你的对象在开始时应该拥有的每个属性.

2)使用内存泄漏检测程序.我总是在C MFC中写入,它会在每次运行时自动报告泄漏及其内存块,因此很容易找到匪徒.

3)当您对程序感到满意时,为了消除泄漏,重新考虑对象的所有权,以便在执行路径的末尾有一个强烈的引用您希望自动销毁的顶层对象.

使用shared_ptr的一个副作用是代码变得更简单.这是c 11设计师所承诺的,这是真的.错误消息迫使我在编译时考虑每个对象的所有权.在析构函数中,我只是测试指针是否为非null并执行删除并希望其他线程完成的日子已经一去不复返了.

一个警告:我没有在已经过期的weak_ptrs周围实现try / catch.我需要为生产代码执行此操作.我会在这里报告.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读