gpt4 book ai didi

c++ - 在结构中创建智能指针?

转载 作者:行者123 更新时间:2023-11-30 02:18:32 26 4
gpt4 key购买 nike

我正在使用结构对二叉树中的节点建模。在结构中,我试图有一个指向左右 child 的指针。

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

当我在我的 main.xml 中创建 root 时特别抛出异常。

我是智能指针的新手(我一直在使用原始指针,我最近了解到这在 C++ 中是一种不好的做法),我曾尝试自己解决这个问题,但没有成功。

有人可以批评我的结构/智能指针使用吗?非常感谢。

#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;
}

最佳答案

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因为它是类型安全的。只需替换 NULLnullptr在您的代码上给出编译器错误,帮助您解决问题。

error: no matching constructor for initialization of 'Node'

关于c++ - 在结构中创建智能指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52022601/

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