2013-03-04 101 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

你能解釋一下爲什麼你無法自己調試嗎? – 2013-03-04 02:40:02

+0

我試過了? Gdb剛剛告訴我,在我的主源文件(我實例化這個對象)中存在一個堆損壞。任何指針都可以工作... – Shokwav 2013-03-04 02:49:49

+0

你嘗試過'valgrind'嗎? – 2013-03-04 03:13:11

回答

1

你的拷貝構造函數複製指針polygonpolyline
這會導致它們被多次刪除。

您應該複製這些對象而不是指針。

+0

這是問題,謝謝。 – Shokwav 2013-03-04 20:50:39