I am trying to store objects that have pointers members in a std::vector. As far as I understand, when push_back is called, a temporary copy of the passed object is made and sent to the vector internal memory, and then it gets destroyed. Therefore, i wrote the copy constructor as shown below:
class MeltPoint
{
public:
MeltPoint();
MeltPoint(b2Vec2* point);
MeltPoint(b2Vec2* point, Segment* segment, bool intersection);
MeltPoint(MeltPoint const& copy);
MeltPoint& operator= (const MeltPoint& m);
~MeltPoint();
private:
b2Vec2* point;
Segment* segment;
bool intersection;
};
MeltPoint::MeltPoint()
{
CCLog("MeltPoint DEFAULT CONSTRUCTOR");
}
MeltPoint::MeltPoint(b2Vec2* point)
{
CCLog("MeltPoint CONSTRUCTOR");
this->point = new b2Vec2();
*(this->point) = *point;
this->segment = new Segment();
this->intersection = false;
}
MeltPoint::MeltPoint(b2Vec2* point, Segment* segment, bool intersection)
{
this->point = point;
this->segment = segment;
this->intersection = intersection;
}
MeltPoint::MeltPoint(MeltPoint const& copy)
{
CCLog("MeltPoint COPY");
point = new b2Vec2();
*point = *copy.point;
segment = new Segment();
*segment= *copy.segment;
}
MeltPoint& MeltPoint::operator= (const MeltPoint& m)
{
CCLog("MeltPoint ASSIGNMENT");
*point = *m.point;
*segment = *m.segment;
return *this;
}
MeltPoint::~MeltPoint()
{
CCLog("MeltPoint DESTRUCTOR");
delete this->point;
delete this->segment;
}
b2Vec2 (Box2D framework) is a struct that simply holds 2D coordinates
Segment is a custom class:
class Segment
{
public:
Segment();
Segment(b2Vec2* firstPoint, b2Vec2* secondPoint);
~Segment();
private:
b2Vec2* firstPoint;
b2Vec2* secondPoint;
};
Segment::Segment()
{
CCLog("Segment DEFAULT CONSTRUCTOR");
this->firstPoint = new b2Vec2(0, 0);
this->secondPoint = new b2Vec2(0, 0);
}
Segment::Segment(b2Vec2* firstPoint, b2Vec2* secondPoint)
{
CCLog("Segment CONSTRUCTOR");
this->firstPoint = firstPoint;
this->secondPoint = secondPoint;
}
Segment::~Segment()
{
CCLog("Segment DESTRUCTOR");
delete firstPoint;
delete secondPoint;
}
In some function I am populating the vector:
void someFunction()
{
vector<MeltPoint> randomVertices;
randomVertices.push_back(MeltPoint(new b2Vec2(190, 170))); //10
randomVertices.push_back(MeltPoint(new b2Vec2(70, 110))); //9
}
And the final output:
MeltPoint CONSTRUCTOR
Segment DEFAULT CONSTRUCTOR
MeltPoint COPY
Segment DEFAULT CONSTRUCTOR
MeltPoint DESTRUCTOR
Segment DESTRUCTOR
MeltPoint CONSTRUCTOR
Segment DEFAULT CONSTRUCTOR
MeltPoint COPY
Segment DEFAULT CONSTRUCTOR
MeltPoint COPY
Segment DEFAULT CONSTRUCTOR
MeltPoint DESTRUCTOR
Segment DESTRUCTOR
MeltPoint DESTRUCTOR
Segment DESTRUCTOR
test(1074,0xac7d9a28) malloc: *** error for object 0x844fd90: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
test(1074,0xac7d9a28) malloc: *** error for object 0x844fda0: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
The errors are raised in the Segment destructor, but I allocated the two pointer members with a new in the constructor. Can you help me please?