在结构中创建智能指针?

时间:2018-08-26 01:56:29

标签: c++ smart-pointers

我正在使用结构在二叉树中建模节点。在该结构中,我试图将指针指向左侧和右侧的孩子。

问题是,由于我创建结构的方式,我一直遇到堆栈溢出的问题。看来我一直在处理智能指针的方式是在堆栈上连续分配内存。

当我在主目录中创建root时,将特别抛出该异常。

我是智能指针的新手(我一直在使用原始指针,最近发现这是C ++中的不良做法),并且我尝试自己解决这个问题而没有运气。

有人可以批评我的struct / smart指针吗?非常感谢。

#include <iostream> 
#include <memory> 

//Node struct 
struct Node
{
    int data;
    std::unique_ptr<Node> left;
    std::unique_ptr<Node> right;

    Node(int data) {
        this->data = data;
        this->left = std::make_unique<Node>(NULL);
        this->right = std::make_unique<Node>(NULL); 
    }

};

//insert Node into binary search tree
void insert(int data, std::unique_ptr<Node>& root)
{
    if (root == NULL)
    {
        root = std::make_unique<Node>(data);
    }
    else {
        if (root->data > data)
        {
            insert(data, root->left);
        }
        else {
            insert(data, root->right);
        }
    }
}

//In Order tree traversal 
void inOrderTraversal(std::unique_ptr<Node>& root)
{
    if (root == NULL) return; 

    inOrderTraversal(root->left); 

    std::cout << root->data << std::endl; 

    inOrderTraversal(root->right); 
}

int main()
{
    //Initialize root to NULL
    std::unique_ptr<Node> root = std::make_unique<Node>(NULL);


    insert(20, root); 
    insert(50, root);
    insert(30, root);
    insert(5, root);
    insert(6, root);
    insert(99, root);
    insert(77, root);
    insert(56, root);
    insert(32, root);
    inOrderTraversal(root); 

    return 0; 
}

2 个答案:

答案 0 :(得分:2)

The function std::make_unique<Node>使用参数来转发Node构造函数。

在C和C ++中,NULL通常只是0的宏。

因此,当您调用std::make_unique<Node>(NULL);时,您正在使用Node初始化data = 0

然后递归调用this->left = std::make_unique<Node>(NULL);,导致无限递归并最终导致堆栈溢出。

要解决此问题,您可以分配std::unique_ptr<Node> left = NULL

我还建议使用nullptr代替NULL,因为它是安全类型。只需在代码上用NULL替换nullptr即可产生编译器错误,从而帮助您解决问题。

  

错误:没有用于初始化“节点”的匹配构造函数

答案 1 :(得分:1)

用nullptr替换所有NULL,不要使用std :: make_unique(NULL);

Node::Node(int data) {
    this->data = data;
    this->left = nullptr;
    this->right = nullptr;
}



int main()
{
    //Initialize root to NULL
    std::unique_ptr<Node> root = nullptr;

        // other codes ..
}