删除指针错误

时间:2012-04-25 15:55:05

标签: c++ pointers

我很困惑为什么在我创建了一个指针并尝试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 个答案:

答案 0 :(得分: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会返回引用,因此您实际上不应该删除它。

答案 1 :(得分:2)

您确实需要删除内存,但是当您在resultTree = &getNodeptree(pt);中重新分配指针时,会覆盖分配的地址。我无法理解应该发生什么,所以我恐怕此时无法提出建议。