0

ポインタを作成して試した後delete、エラーメッセージが表示される理由について混乱しています。以下は、私が使用してきたいくつかの要約コードです。

func()
{
  ptree *resultTree = new ptree;
  resultTree = &getNodeptree(pt);
  delete resultTree;
}

ptree& getNodeptree (ptree &pt)  
{
  BOOST_FOREACH(ptree::value_type &v, pt.get_child("root"))
  {
    ptree &temp = v.second;
    return temp;
  }
}

私の理解resultTreeでは、メモリはまだヒープ上にあるため、削除する必要があります。ただし、それを実行しようとすると、次のようになります。

*** glibc detected *** /home/nathan/Programming/Project_Code/MyBoostXmlTest/Debug/MyBoostXmlTest: free(): invalid pointer: 0x00000000018347b8 ***

deleteこの場合、呼び出しによってエラーが発生する理由を誰かが説明できますか?

4

2 に答える 2

4

を削除するresultTreeと、への関数呼び出しから渡されたメモリが削除されますgetNodeptree。そして、newへの明示的な呼び出しからメモリを削除できていません。

func()
{
  ptree *resultTree = new ptree; // you will need to delete this one
  resultTree = &getNodeptree(pt); // now it points to something else!
  delete resultTree; // now you delete something you shouldn't
}

参照を返すのでgetNodeptree、実際にはそれを削除するべきではありません。

于 2012-04-25T15:58:03.303 に答える
2

メモリを削除する必要はありますが、でポインタを再割り当てするときに割り当てたアドレスを上書きしますresultTree = &getNodeptree(pt);。何が起こっているのかわからないので、現時点では提案できません。

于 2012-04-25T15:57:57.250 に答える