如何修复 "terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_M_construct null not valid" 异常?
How to fix "terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_M_construct null not valid" exception?
我有下面的代码,由二叉树数据结构组成:
#include <bits/stdc++.h>
#define DEFAULT_NODE_VALUE 0
using namespace std;
template <class T>
class node{
public:
T val;
node* right = 0;
node* left = 0;
node(T a):val(a){}
};
template <class T>
class tree{
public:
node<T>* root = new node<T>(DEFAULT_NODE_VALUE);
tree(T inp_val){
root->val = inp_val;
}
void inorder_traverse(node<T>* temp){
if (!temp)
return;
inorder_traverse(temp->left);
cout << temp->val << " -> ";
inorder_traverse(temp->right);
}
void inorder_traverse(){
inorder_traverse(root);
}
};
int main()
{
tree<string> my_tree("mantap");
my_tree.root->right = new node<string>("ok");
my_tree.root->left = new node<string>("haha");
my_tree.inorder_traverse();
return 0;
}
当我 运行 它时,它向我显示如下所示的异常:
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_M_construct null not valid
有人可以帮我解决这个 运行 时间错误吗?提前致谢...
您正在尝试用 0
初始化 std::string
。 std::string
没有一个只接受 int
的构造函数,但它确实有一个接受指针的构造函数,并且整数文字 0
可以隐式转换为指针——具体来说,空指针。
但是,当你传递一个指针来初始化一个 std::string
时,它必须是一个非空指针,所以传递零会破坏事情(你得到的错误消息告诉你你试图打破它)。
我的建议是摆脱你的:DEFAULT_NODE_VALUE
,而是提供一个默认参数来初始化节点中的项目:
node(T a = T()):val(a){}
在这种情况下,它将像以前对 node<int>
之类的事情一样工作,但对于无法从 0
初始化的类型也能正常工作。这也摆脱了客户端代码中丑陋的 DEFAULT_NODE_VALUE
。
我有下面的代码,由二叉树数据结构组成:
#include <bits/stdc++.h>
#define DEFAULT_NODE_VALUE 0
using namespace std;
template <class T>
class node{
public:
T val;
node* right = 0;
node* left = 0;
node(T a):val(a){}
};
template <class T>
class tree{
public:
node<T>* root = new node<T>(DEFAULT_NODE_VALUE);
tree(T inp_val){
root->val = inp_val;
}
void inorder_traverse(node<T>* temp){
if (!temp)
return;
inorder_traverse(temp->left);
cout << temp->val << " -> ";
inorder_traverse(temp->right);
}
void inorder_traverse(){
inorder_traverse(root);
}
};
int main()
{
tree<string> my_tree("mantap");
my_tree.root->right = new node<string>("ok");
my_tree.root->left = new node<string>("haha");
my_tree.inorder_traverse();
return 0;
}
当我 运行 它时,它向我显示如下所示的异常:
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_M_construct null not valid
有人可以帮我解决这个 运行 时间错误吗?提前致谢...
您正在尝试用 0
初始化 std::string
。 std::string
没有一个只接受 int
的构造函数,但它确实有一个接受指针的构造函数,并且整数文字 0
可以隐式转换为指针——具体来说,空指针。
但是,当你传递一个指针来初始化一个 std::string
时,它必须是一个非空指针,所以传递零会破坏事情(你得到的错误消息告诉你你试图打破它)。
我的建议是摆脱你的:DEFAULT_NODE_VALUE
,而是提供一个默认参数来初始化节点中的项目:
node(T a = T()):val(a){}
在这种情况下,它将像以前对 node<int>
之类的事情一样工作,但对于无法从 0
初始化的类型也能正常工作。这也摆脱了客户端代码中丑陋的 DEFAULT_NODE_VALUE
。