2012-04-25 134 views
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產生一個錯誤?

+2

什麼是ptree? – 2012-04-25 15:58:51

+0

'func()'中的'pt'是什麼? – 2012-04-25 16:05:51

+0

pt是Boost Property Tree:http://www.boost.org/doc/libs/1_41_0/doc/html/property_tree.html – nf313743 2012-04-25 16:15:06

回答

4

當您刪除resultTree時,您正在將函數調用中傳遞給您的內存刪除到getNodeptree。而且你無法從顯式調用中刪除內存。

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 2012-04-25 16:02:06

+0

但是他沒有得到參考文獻所指的地址嗎?也許他的問題是他正在刪除他不應該的東西(也許'ptree'是一個自我管理的類) – Muggen 2012-04-25 16:02:14

+0

@ johnnyturbo3那麼,你應該刪除'new'和'delete'。 – juanchopanza 2012-04-25 16:03:27

2

您確實需要刪除內存,但是當您重新指定resultTree = &getNodeptree(pt);中的指針時,您將覆蓋您分配的地址。我無法理解應該發生什麼,因此我恐怕現在不能提出建議。