【问题标题】:Member access within misaligned address when trying to make a tree尝试制作树时在未对齐的地址中的成员访问
【发布时间】:2020-11-08 04:16:15
【问题描述】:

我正在尝试编写将向量转换为树的代码,但出现错误:

Line 51: Char 27: runtime error: member access within misaligned address 0xbebebebebebebebe for type 'TreeNode', which requires 8 byte alignment (solution.cpp)
0xbebebebebebebebe: note: pointer points here
<memory cannot be printed>
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior prog_joined.cpp:56:27   
TreeNode* deserialize(vector<string> v) {
        int i=0;
        TreeNode* root = new TreeNode(stoi(v[i]));
        queue<TreeNode*> q;
        q.push(root);
        v.erase(v.begin());
        while(v.size()>0)
        {
        if(v[0]==",")
        {
            q.front()->left=NULL;
            q.pop();
            v.erase(v.begin());
        }
        else
        {
         //  TreeNode* root2 = new TreeNode(stoi(v[0]));
           q.front()->left->val=stoi(v[0]);
            q.push( q.front()->left);
            q.pop();
            v.erase(v.begin());
        }
   
   return root;
}

【问题讨论】:

  • 0xbebebebebebebebe 表示指针从未初始化。
  • 如果您使用调试器,您可能会发现,在某些时候,q 会因任何原因变为空,因此q.front() 会导致demons flying out of your nose。显示的代码无法检查q 中是否有任何内容,并在访问q.front() 之前相信它。你永远不应该假设 C++ 中的任何东西。
  • 当您看到此错误时,提供v 的内容会有所帮助。或者只是使用已经建议的调试器。
  • 看来逻辑错了。不管v 的内容是什么,队列永远不会超过1。如果v 中有两个或更多逗号,它肯定会崩溃(我的意思是,调用未定义的行为)。
  • 您永远不会将任何东西的left(或right)设置为任何有意义的东西。树中的每个节点都应该有一个new TreeNode

标签: c++


【解决方案1】:

这主要发生在这段代码中,因为您没有正确初始化节点的左右指针。它们被设置为 NULL 但它不应该发生。应该使用

为它们分配内存
new TreeNode() 

内存中的值被初始化为NULL。

应该是这样的

        TreeNode(){
            left = NULL;
            right = NULL;
        }
        TreeNode(int l,int r){
            e= r;
            s = l;
            left = new treenode();
            right = new treenode();
        }

【讨论】:

    猜你喜欢
    • 2017-12-29
    • 2019-04-28
    • 2022-11-11
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    • 2010-12-29
    • 2019-03-22
    • 1970-01-01
    相关资源
    最近更新 更多