2012-04-25 16 views
0

私はポインタを作成した後、なぜdeleteを受け取ったのか、そしてエラーメッセージが表示されるのはどういうふうに混乱しているのですか?それのメモリはヒープに残っているので、私の理解resultTreeからポインタのエラーを削除する

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

まだ削除する必要がある:以下は、私が取り組んできたいくつかの凝縮コードです。しかし、それをやろうとすると、生成します。deleteを呼び出すと、このインスタンスでエラーが発生し、なぜ

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

誰かが説明できますか?

+2

'ptree'とは何ですか? –

+0

'func()'の 'pt'とは何ですか? –

+0

ptはBoostプロパティツリーです:http://www.boost.org/doc/libs/1_41_0/doc/html/property_tree.html – nf313743

答えて

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は参照を返しますので、実際には削除しないでください。

+0

わかりました。どうすれば宣言から '= new'を削除したのですか?それが何を解決するのか? – nf313743

+0

しかし、彼は参照があまりにも参照するもののアドレスを取得していないのですか?多分、彼の問題は彼が自分がすべきではないものを削除していることです(多分 'ptree'は自己管理クラスです)。 – Muggen

+0

@ johnnyturbo3まあ、' new'と 'delete'も削除してください。 – juanchopanza

2

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

関連する問題