临时指针指向使用向量地址

时间:2013-04-18 02:44:31

标签: 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)))";

我做了一些击打并消除了“(”和“)”并将所有单独的部分保留在向后的矢量中, aftersplit有(底部)OR AND传递N​​OT拒绝而不传递拒绝(back)

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”的左子“pass”,也就是说,“AND”指向他的左子,地址为0x00007fff6d8da7e0,新的临时leftnode是分配地址0x00007fff6d8da7e0也是 之后 在那之前树就像

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

之后,为leftnode分配了“pass”的地址,它将会是

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

等,都指向自己,我知道指针可能有问题,但我无法弄明白。 请帮帮我

1 个答案:

答案 0 :(得分:1)

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,它们也会保持有效。 但是你必须不要忘记事后delete