我正在使用结构在二叉树中建模节点。在该结构中,我试图将指针指向左侧和右侧的孩子。
问题是,由于我创建结构的方式,我一直遇到堆栈溢出的问题。看来我一直在处理智能指针的方式是在堆栈上连续分配内存。
当我在主目录中创建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;
}
答案 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 ..
}