2013-03-04 3 views
1

"CreateFromNode"함수에서 다음과 같은 클래스 정의 파일에서 이상한 힙 손상이 발생합니다. 아무도 이것으로 나를 도울 수 있습니까? 나는 그것을 잡았을 때부터 지금 당장이 문제를 다루고 싶다. 또한 외부 클래스는이 클래스의 멤버 (또는 멤버)를 수정하지 않습니다.이상한 힙 손상 문제?

#include "Object.h" 

TmxMap::Object::Object():name(), position(), size(), gid(-1), visible(true), 
properties(), image(), polygon(NULL), polyline(NULL), ellipse(false){} 

TmxMap::Object::Object(rapidxml::xml_node<>* const& object_node):name(), 
    position(), size(), gid(-1), visible(true), properties(), image(), 
    polygon(NULL), polyline(NULL), ellipse(false){ 
CreateFromNode(object_node); 
} 

TmxMap::Object::Object(TmxMap::Object const& from):name(from.name), 
    position(from.position), size(from.size), gid(from.gid), 
    visible(from.visible), properties(from.properties), 
    image(from.image), polygon(from.polygon), polyline(from.polyline), 
    ellipse(from.ellipse){} 

TmxMap::Object::~Object(){ 
DeleteObjects(); 
} 

void TmxMap::Object::CreateFromNode(rapidxml::xml_node<>* const& object_node){ 
DeleteObjects(); 

rapidxml::xml_node<>* data_node = NULL; 
rapidxml::xml_attribute<>* data_attrib = NULL; 

if((data_attrib = object_node -> first_attribute("name"))) 
    name = data_attrib -> value(); 

if((data_attrib = object_node -> first_attribute("width"))) 
    size.x = std::strtol(data_attrib -> value(), NULL, 10); 
if((data_attrib = object_node -> first_attribute("height"))) 
    size.y = std::strtol(data_attrib -> value(), NULL, 10); 

position.Set(
     std::strtol(object_node -> first_attribute("x") -> value(), NULL, 10), 
     std::strtol(object_node -> first_attribute("y") -> value(), NULL, 10) 
); 

if((data_node = object_node -> first_node("polygon"))) 
    polygon = new Polygon2D<int>(data_node); 

if((data_node = object_node -> first_node("polyline"))) 
    polyline = new Polyline2D<int>(data_node); 

ellipse = (object_node -> first_node("ellipse") != NULL); 
} 

void TmxMap::Object::DeleteObjects(){ 
if(polygon){delete polygon; polygon = NULL;} 
if(polyline){delete polyline; polyline = NULL;} 
} 

void TmxMap::Object::Destroy(){ 
name.clear(); 
position.Set(); 
size.Set(); 
gid = 0; 
visible = true; 
properties.Destroy(); 
image.Destroy(); 
DeleteObjects(); 
ellipse = false; 
    } 
+2

직접 디버깅 할 수없는 이유를 설명해 주시겠습니까? –

+0

해봤습니까? Gdb는 방금 주 소스 파일 (이 객체를 인스턴스화 한 곳)에 힙 손상이 있다고 말했습니다. 그것에 대한 모든 포인터가 너무 효과가있을 것입니다 ... – Shokwav

+0

'valgrind'를 아직 시도해 보셨습니까? –

답변

1

귀하의 복사 생성자 복사 포인터 polygonpolyline.
이렇게하면 여러 번 삭제 될 수 있습니다.

포인터 대신 해당 개체를 복사해야합니다.

+0

이것이 문제였습니다. 고마워요. – Shokwav