Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 奇怪的堆腐败问题?_C++_Heap Corruption - Fatal编程技术网

C++ 奇怪的堆腐败问题?

C++ 奇怪的堆腐败问题?,c++,heap-corruption,C++,Heap Corruption,出于某种原因,我从下面的类定义文件中得到了一个奇怪的堆损坏,很可能是在“CreateFromNode”函数中。有人能帮我吗?我现在真的很想处理这个问题,因为我抓到了它,以后再也看不到它的出现。此外,没有外力在修改此类的任何成员(或其成员) #包括“Object.h” TmxMap::Object::Object():name(),position(),size(),gid(-1),visible(true), 属性(),图像(),多边形(空),多段线(空),椭圆(假){} TmxMap::Obj

出于某种原因,我从下面的类定义文件中得到了一个奇怪的堆损坏,很可能是在“CreateFromNode”函数中。有人能帮我吗?我现在真的很想处理这个问题,因为我抓到了它,以后再也看不到它的出现。此外,没有外力在修改此类的任何成员(或其成员)

#包括“Object.h”
TmxMap::Object::Object():name(),position(),size(),gid(-1),visible(true),
属性(),图像(),多边形(空),多段线(空),椭圆(假){}
TmxMap::Object::Object(rapidxml::xml_节点*常量和对象_节点):name(),
位置()、大小()、gid(-1)、可见(真)、属性()、图像(),
多边形(空)、多段线(空)、椭圆(假){
CreateFromNode(对象\节点);
}
TmxMap::Object::Object(TmxMap::Object const&from):name(from.name),
位置(from.position)、大小(from.size)、gid(from.gid),
可见(从.visible)、属性(从.properties),
图像(来自.image)、多边形(来自.polygon)、多段线(来自.polyline),
椭圆(从.椭圆){}
TmxMap::Object::~Object(){
DeleteObjects();
}
void TmxMap::Object::CreateFromNode(rapidxml::xml_节点*常量和对象_节点){
DeleteObjects();
rapidxml::xml_节点*数据_节点=NULL;
rapidxml::xml_属性*数据_属性=NULL;
如果((数据属性=对象节点->第一属性(“名称”))
名称=数据属性->值();
如果((数据属性=对象节点->第一属性(“宽度”))
size.x=std::strtol(data_attrib->value(),NULL,10);
如果((数据属性=对象节点->第一属性(“高度”))
size.y=std::strtol(data_attrib->value(),NULL,10);
位置,设定(
std::strtol(object_node->first_属性(“x”)->value(),NULL,10),
std::strtol(对象\节点->第一个\属性(“y”)->value(),NULL,10)
);
如果((数据节点=对象节点->第一个节点(“多边形”))
多边形=新的多边形2D(数据节点);
如果((数据节点=对象节点->第一个节点(“多段线”))
多段线=新的多段线2D(数据节点);
椭圆=(对象节点->第一个节点(“椭圆”)!=NULL);
}
void TmxMap::Object::DeleteObjects(){
如果(多边形){delete polygon;polygon=NULL;}
如果(多段线){delete polyline;polyline=NULL;}
}
void TmxMap::Object::Destroy(){
name.clear();
position.Set();
size.Set();
gid=0;
可见=真实;
properties.Destroy();
image.Destroy();
DeleteObjects();
椭圆=假;
}

复制构造函数复制指针
多边形
多段线

这将导致它们被多次删除


您应该复制这些对象,而不是指针。

您的复制构造函数复制指针
多边形
多段线

这将导致它们被多次删除


你应该复制那些对象而不是指针。

你能解释一下为什么不能自己调试吗?我试过了?Gdb刚刚告诉我在我的主源文件(我在其中实例化了这个对象)中有一个堆损坏。任何关于这方面的指针都会起作用……你试过
valgrind
了吗?对不起,我应该注意到我使用的是Windows7(和eclipse)。还有别的选择吗?在windows腐败检测方式中,您能解释一下为什么您不能自己调试这个吗?我试过了?Gdb刚刚告诉我在我的主源文件(我在其中实例化了这个对象)中有一个堆损坏。任何关于这方面的指针都会起作用……你试过
valgrind
了吗?对不起,我应该注意到我使用的是Windows7(和eclipse)。还有别的选择吗?在windows腐败检测方法中,这就是问题所在,谢谢。这就是问题所在,谢谢。
#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;
   }