std::vector にポインター メンバーを持つオブジェクトを格納しようとしています。私が理解している限りでは、push_back が呼び出されると、渡されたオブジェクトの一時コピーが作成され、ベクターの内部メモリに送信され、その後破棄されます。したがって、以下に示すようにコピーコンストラクターを作成しました。
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 フレームワーク) は、単純に 2D 座標を保持する構造体です。
セグメントはカスタム クラスです。
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;
}
いくつかの関数では、ベクトルを設定しています:
void someFunction()
{
vector<MeltPoint> randomVertices;
randomVertices.push_back(MeltPoint(new b2Vec2(190, 170))); //10
randomVertices.push_back(MeltPoint(new b2Vec2(70, 110))); //9
}
そして最終的な出力:
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
エラーは Segment デストラクタで発生しますが、コンストラクタで new を使用して 2 つのポインタ メンバーを割り当てました。助けてください。