gpt4 book ai didi

c++11 - 无法消除共享指针泄漏的递归解析代码

转载 作者:行者123 更新时间:2023-12-02 23:22:49 24 4
gpt4 key购买 nike

我在生产代码中广泛使用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) 开始对项目进行编程时一般不考虑使用弱指针。使所有内容共享 ptr。你需要全神贯注地解决手头的项目,不要分心。也就是说,在完成之前不要尝试优化。这可以让您避免因 ptr 逻辑而导致工程代码的怪异。顺便说一句,下次您将对每个对象一开始应具有的所有权属性进行更好的估计。

2) 使用内存泄漏检测程序。我总是用 C++ MFC 编写,它会在每次运行时自动报告泄漏及其内存块,因此很容易找到罪魁祸首。

3) 当您对程序感到满意时,为了消除泄漏,请重新考虑对象的所有权,以便有 1 个对您希望在程序结束时自动销毁的顶级对象的强引用。执行路径。

使用shared_ptr的一个副作用是代码变得更简单。这是 c++11 设计者向我们 promise 的,也是事实。这些错误消息迫使我在编译时仔细考虑每个对象的所有权。我在析构函数中只是测试指针是否非空并执行删除并希望其他线程完成的日子已经一去不复返了。

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

关于c++11 - 无法消除共享指针泄漏的递归解析代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30242402/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com