C++ C++;使用运算符重载构建双面树-什么是好的内存解决方案?

C++ C++;使用运算符重载构建双面树-什么是好的内存解决方案?,c++,pointers,memory,memory-management,C++,Pointers,Memory,Memory Management,所以我之前问过这个问题: 我想知道,如果我进一步强调,父母必须有一个指向他们孩子的指针列表,有没有好的解决方案,在不以任何方式与共享和弱指针发生任何内存泄漏方面,因为我将需要在操作符体中动态分配内存。可以假设计算图是非循环的 具体考虑我的.H: class Interface{ public: int myid(); Interface(double in); ~Interface(){ std::cout<<"Destroy "<

所以我之前问过这个问题: 我想知道,如果我进一步强调,父母必须有一个指向他们孩子的指针列表,有没有好的解决方案,在不以任何方式与共享和弱指针发生任何内存泄漏方面,因为我将需要在操作符体中动态分配内存。可以假设计算图是非循环的

具体考虑我的.H:

class Interface{
public:
    int myid();
    Interface(double in);
    ~Interface(){
            std::cout<<"Destroy "<<myid()<<std::endl;
     }
    friend Interface operator+(const Interface& a, const Interface& b);
    void tree();
private:
    class Impl;
    std::shared_ptr<Impl> pimpl;
};
Interface operator+(const Interface& a, const Interface& b);
我想要和期待的是:

5-(4,3,)
4-(1,2,)
1-()
2-()
3-()
Destroy 3
Destroy 2
Destroy 1
Destroy 5
Destroy 4

我的问题是为什么临时创建的对象4和5不能自动释放?在1,2,3被销毁后,这些实例可能只有弱的\u ptr,而没有共享的\u ptr,或者我错了吗?

我没有读你前面的问题,但当我编写一个二叉树实现时,我发现对子节点使用
std::unique\u ptr
和一个指向父节点的简单原始指针非常方便,例如

struct Node
{
    Node *parent;
    std::unique_ptr<Node> right;
    std::unique_ptr<Node> left;
};
struct节点
{
节点*父节点;
std::唯一的ptr权限;
std::唯一左上角;
};

所有这些都应初始化为
std::nullptr
。这样,一旦
节点
被解构,
下方的整个子树都将被正确解构,因此无需递归执行此操作。指向父节点的“观察指针”意味着您永远不应该对它执行一些与内存相关的操作,尤其是不执行删除操作。

因此,在我的例子中,一个子节点可以有多个父节点,我正在重载运算符+,以便它获取类节点的两个实例并创建一个新实例并返回它。这意味着我必须通过引用而不是运算符+的值返回,因为像a+b+c这样的表达式,其中有一个临时对象。在术语中,这意味着使用原始指针,临时节点将不会被清理。@Belov:是的,我的答案是指一个特殊的例子。对于一般的非循环图,您可以切换到一个
共享的\u ptr
,切换到子级/
弱的\u ptr
,切换到父级实现。听起来您想从操作符+返回一个唯一的\u ptr,谢谢,这可能会起作用,唯一剩下的事情是如何进入操作符+从引用重载(节点&p1)做一个弱者?你知道吗?@Arvid:我不知道
operator+
应该在这里做什么,在此之前我不想给出任何建议。此外,一般来说,我甚至不知道
operator+
应该为两个节点做什么,所以我根本不会使用它。
5-(4,3,)
4-(1,2,)
1-()
2-()
3-()
Destroy 3
Destroy 2
Destroy 1
Destroy 5
Destroy 4
struct Node
{
    Node *parent;
    std::unique_ptr<Node> right;
    std::unique_ptr<Node> left;
};