c++ - 指向使用 vector 地址的临时指针

标签 c++ parsing pointers binary-tree

我有一个关于将字符串 s 解析为二叉树的问题。

struct TreeNode {
string val;         // The data in this node.
TreeNode *left;   // Pointer to the left subtree.
TreeNode *right;  // Pointer to the right subtree.
};

string s="((OR (AND pass (NOT reject)) (AND (NOT pass) reject)))";

我画了一些笔划并消除了“(”和“)”并将所有单独的部分保留在 vector aftersplit中, aftersplit 具有(底部)OR AND pass NOT reject AND NOT pass reject(返回)

vector<string> aftersplit;
vector<TreeNode> parsetree;
while (!aftersplit.empty())//do the parsing 
{

     TreeNode *temp=new TreeNode;

    temp->val=aftersplit.back();
    temp->left=NULL;
    temp->right=NULL;        
    aftersplit.pop_back();
    if(temp->val=="AND"||temp->val=="OR"||temp->val=="=>"||temp->val=="<=>"){
        TreeNode *leftnode = new TreeNode; 

        leftnode=&parsetree.back();
        parsetree.pop_back();
        temp->left=leftnode;
        TreeNode *rightnode = new TreeNode; 

        rightnode=&parsetree.back();
        parsetree.pop_back();
        temp->right=rightnode;
        parsetree.push_back(temp); //can not put the temp into parsetree 
    }
    else if(temp->val=="NOT")
    {
        TreeNode *leftnode = new TreeNode; 

        leftnode=&parsetree.back();
        parsetree.pop_back();
        temp->left=leftnode;
        parsetree.push_back(temp);        
    }
    else {            
        parsetree.push_back(temp);
    }

我从右到左处理字符串s

然而,当我运行“TreeNode leftnode”时,运算符是“OR”; lefenode被分配了一个地址,这个地址被第一个“AND”的左 child “pass”使用,也就是说,“AND”指向他的左 child 地址0x00007fff6d8da7e0,新的临时leftnode正在分配地址0x00007fff6d8da7e0 太 在那之后 在那之前,树就像

    (AND)            
       / \        
      /   \       
   pass  (NOT)         
          /          
      reject  

在leftnode被分配到它喜欢的“pass”地址之后

                (AND)            
                 /    \        
                /      \       
              (AND)    (NOT)         
              /    \     /     
             /      \   /          
          (AND) (NOT) reject
         /    \        
        /      \       
     (AND)    (NOT)  

等等,都指向它自己,我知道指针可能有问题,但我想不通。 请帮助我

最佳答案

if(temp.val=="AND"||temp.val=="OR"||temp.val=="=>"||temp.val=="<=>"){
    TreeNode leftnode;  //appear a bug here
    leftnode=parsetree.back();
    parsetree.pop_back();
    temp.left=&leftnode;
    TreeNode rightnode;
    rightnode=parsetree.back();
    parsetree.pop_back();
    temp.right=&rightnode;
    parsetree.push_back(temp);  
}

您的变量 leftnoderightnode 的生命周期有限。因为它们是在您的 if 范围内声明的,所以一旦您离开那里,它们就会被销毁。这意味着他们的地址无效!因此,每次 temp.left 和 temp.right 的内容都会指向一些垃圾数据。

这实际上就是为什么你可以看到你多次找到相同的地址:因为之前的对象已经被销毁,它被用来存储你需要的新数据。但这并不是您想要的,因为您想要保留您创建的所有对象。

最简单的方法是动态创建您需要的 TreeNode(并相应地修改其余代码):

TreeNode *leftnode = new TreeNode;
TreeNode *rightnode = new TreeNode;

那样的话,即使跳出if,它们也会保持有效。 但是,您一定不要忘记之后删除它们。

关于c++ - 指向使用 vector 地址的临时指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16073637/

相关文章:

c++ - 仅当当前行溢出 clang 格式时才在新行上加括号

c++ - 谁能解释一下当前C++0x标准草案的这一段?

c++ - 从本地语言进行 Qt 国际化

java - NoNewLineParagraph 无法转换为 Element

parsing - 如何设置 flex/bison 规则来解析逗号分隔的参数列表

C++ 在另一个对象中引用一个对象的当前状态

c - 如何在 C 中使用 curl 并解析 JSON 响应

c++ - C++ 中的指针,原始内存操作

c++ - 当您将一个指针分配给另一个指针时会发生什么?

c++ - 从类或独立函数指向函数的函数指针