在结构中创建智能指针?



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

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

当我在 main 中创建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; 
}

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

在C和C++NULL中通常只是一个宏0

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

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

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

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

错误:没有匹配的构造函数来初始化"节点">

将所有NULL 替换为 nullptr,不要使用 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 ..
}

最新更新