删除指针错误

Delete pointer error

本文关键字:错误 指针 删除      更新时间:2023-10-16

我很困惑为什么在我创建了一个指针并尝试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会产生错误吗?

当你删除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返回引用,因此您真的不应该删除它。

您确实需要删除内存,但是在 resultTree = &getNodeptree(pt); 中重新分配指针时会覆盖分配的地址。我不明白应该发生什么,所以我恐怕现在不能提供建议。