2012-04-25 3 views
0

포인터를 만든 후 delete 메시지가 표시되면서 오류 메시지가 표시되는 이유에 대해 혼란 스럽습니다. 나의 이해 resultTree에서포인터 오류가 발생했습니다.

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; 
    } 
} 

는 여전히 메모리가 힙에 여전히 있기 때문에 삭제해야 : 다음은 내가 함께 일한지 몇 가지 압축 된 코드입니다. delete를 호출하면이 경우에 오류가 발생하는 이유

*** glibc detected *** /home/nathan/Programming/Project_Code/MyBoostXmlTest/Debug/MyBoostXmlTest: free(): invalid pointer: 0x00000000018347b8 *** 

누군가는 설명 할 수 그러나, 그 생산을하려고?

+2

'ptree'란 무엇입니까? –

+0

'func()'의'pt'는 무엇입니까? –

+0

pt는 Boost 속성 트리입니다. http://www.boost.org/doc/libs/1_41_0/doc/html/property_tree.html – nf313743

답변

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은 참조를 반환하므로 실제로 삭제하면 안됩니다.

+0

좋아, 이해할 것 같아. 어떻게하면 선언에서'= new'을 제거했는지 알 수 있습니다. 그게 무슨 문제입니까? – nf313743

+0

그러나 참조가 언급 한 것의 주소를 얻지 못했습니까? 어쩌면 그의 문제는 자신이 안되는 것을 지우는 것일 수도 있습니다. (아마도'ptree'는 자체 관리 클래스입니다.) – Muggen

+0

@ johnnyturbo3 글쎄,'new'와'delete'도 제거해야합니다. – juanchopanza

2

메모리를 삭제해야하지만 resultTree = &getNodeptree(pt);에 포인터를 다시 지정할 때 할당 한 주소를 덮어 씁니다. 무슨 일이 일어나고 있는지 이해할 수 없어서 현재로서는 제안을 드릴 수 없습니다.

관련 문제