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

1 に答える 1

1

コピーコンストラクターは、ポインターpolygonとをコピーしますpolyline
これにより、それらが複数回削除されることになります。

ポインタの代わりにそれらのオブジェクトをコピーする必要があります。

于 2013-03-04T08:30:18.227 に答える