微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何修复“抛出'std::logic_error'what()的实例后调用终止:basic_string::_M_construct null not valid”异常?

如何解决如何修复“抛出'std::logic_error'what()的实例后调用终止:basic_string::_M_construct null not valid”异常?

我在下面有包含二叉树数据结构的代码

errno

当我运行它时,它向我展示了如下所示的异常:

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

谁能帮我修复这个运行时错误?提前致谢...

解决方法

您正在尝试使用 std::string 初始化 0std::string 没有只接受 int 的ctor,但它确实有一个接受指针的ctor,并且整数文字0 可以隐式转换为指针——特别是,一个空指针。

但是,当你传递一个指针来初始化一个 std::string 时,它必须是一个非空指针,所以传递零会破坏事情(并且你得到的错误消息告诉你你已经试图打破它)。

我的建议是去掉你的:DEFAULT_NODE_VALUE,而是提供一个默认参数来初始化节点中的项目:

node(T a = T()):val(a){}

在这种情况下,它会像以前对 node<int> 之类的东西一样工作,但对于无法从 0 初始化的类型也能正常工作。这也消除了客户端代码中丑陋的 DEFAULT_NODE_VALUE

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。