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 回答