我很困惑为什么在我创建了一个指针并尝试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
会产生错误吗?
答案 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);
中重新分配指针时,会覆盖分配的地址。我无法理解应该发生什么,所以我恐怕此时无法提出建议。