Я пытаюсь перегрузить оператор присваивания, чтобы сделать глубокую копию многоугольного объекта, программа компилируется, но ближе к концу я получаю сообщение об ошибке, которое я хочу устранить. Ниже приведен соответствующий код. Если вы считаете, что мне нужно добавить больше, просто оставьте комментарий. Предположим, что правильные #include
и что оператор <<
перегружен для правильного вывода и т. Д.
Ошибка: malloc: * ошибка для объекта 0x1001c0: освобождаемый указатель не был выделен * установите точку останова в malloc_error_break для отладки.
//Polygon.h
// contains two classes PolygonNode and Polygon
class PolygonNode //Used to link points in a polygon so that they can be iterated through in order
{
public:
...
methods etc
...
private:
Point pt_; // the points in the polygon are made using the Point class
PolygonNode* link_ ; // pointer to the next point in the polygon
};
class Polygon // Connects points and forms a polygon
{
public:
...
Polygon& operator= (Polygon ply);
void Polygon::addPoint(const Point &p);
// methods etc
...
private:
int numPoints_;
bool closed_polygon_;
PolygonNode* first_ ; // points to the first point of the polygon
PolygonNode* last_ ; // points to the last point of the polygon
};
//Polygon.cpp
...
PolygonNode::~PolygonNode()
{
delete link_ ; // possible problem area
}
Polygon::~Polygon()
{
delete first_ ; // possible problem area
last_ = NULL ;
}
void Polygon::addPoint(const Point &p)
{
PolygonNode* ptr ;
ptr = new PolygonNode(p) ;
if( last_ != NULL )
last_->setLink(ptr) ;
last_ = ptr ;
if( first_ == NULL )
first_ = last_ ;
numPoints_++ ;
}
Polygon& Polygon::operator= (const Polygon ply)
{
for (int i = 0; i < ply.numPoints()-1; i++)
{
addPoint(ply.getPoint(i));
}
if (ply.isClosed())
{
closePolygon();
}
else
{
addPoint(ply.getPoint(ply.numPoints()-1));
}
return this;
}
void Polygon::addPoint(const Point &p)
{
PolygonNode ptr ;
ptr = new PolygonNode(p) ;
if( last_ != NULL )
last_->setLink(ptr) ; // sets the last pointer to the new last point
last_ = ptr ;
if( first_ == NULL )
first_ = last_ ;
numPoints_++ ;
}
...
//main.cpp
Polygon ply;
...
Point pt0(0,0);
Point pt1(1,1);
ply.addPoint(pt0);
cout << "ply = " << ply << endl;
Polygon newply;
newply = ply; // use of the assignment operator
cout << "Polygon newply = ply;" << endl;
cout << "newply = " << newply << endl;
cout << "ply = " << ply << endl;
newply.addPoint(pt1);
cout << "newply.addPoint(Point(0,0)); " << endl;
cout << "newply = " << newply << endl;
cout << "ply = " << ply << endl;
...
Я читал в другом месте, что это, возможно, связано с ошибкой в OS 10.6 или Xcode 3.2, если есть обходной путь, может ли кто-нибудь дать мне подробные инструкции о том, как это сделать, у меня нет большого опыта работы с Xcode.
Отредактировано: добавлены части кода, в которых используется delete
, обратите внимание, что он используется в деструкторах для Polygon и PolygonNode.
Отредактировано: добавлена часть кода, в которой размещена ссылка_, setLink - это простой метод установки.
free
илиdelete
, вероятно, очень важен для этой ошибки. - person TheUndeadFish   schedule 15.08.2010link_
переменную? эта часть кода отсутствует в вашем примере. - person Sadeq   schedule 15.08.2010link_
, этоlast_
! :) - person Sadeq   schedule 15.08.2010