我正在尝试重载赋值运算符以执行多边形对象的深层复制,程序编译但是我得到了一个错误,我想要清除它。以下是相关代码,如果您认为我需要添加更多,请发表评论。假设正确#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的经验
已编辑:添加了使用 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;
的代码部分,请注意它正在多边形和多边形网格的析构函数中使用
编辑:添加了分配link_的代码部分,setLink是一个简单的setter方法。
答案 0 :(得分:2)
我看不到PolygonNode
类的构造函数。 link_
指针在创建时是否初始化为null?如果没有,那可能是你得到的错误中出现的问题。您必须确保link_
实例中的PolygonNode
指针初始化为null。定义适当的构造函数。
您是否为多边形类定义了复制构造函数?我在代码中看不到一个,但也许你只是没有粘贴它而你有一个。如果不是,那可能是严重问题的原因之一。
由编译器自动合成的复制构造函数将只复制Polygon
类中的指针。
您的赋值运算符按值
获取参数Polygon& operator= (Polygon ply);
这使用了复制构造函数。如果它是自动合成的,运算符内的ply
具有指向同一列表的指针,则由值传递给运算符的参数拥有。 ply
的行为就像它拥有列表一样,当ply
超出范围时,列表会被销毁。最初的论点留下了悬空指针。
您应该定义正确的复制构造函数。
您还应该考虑通过const引用在赋值运算符中获取参数。我认为没有理由接受它的价值。也许你有一个,但即使你这样做,你可以在定义正确的复制构造函数之前临时更改它,以测试操作符。在您的操作员中,您应该检查自我分配。我现在可以看到的是向旧Polygon
添加新节点。我不认为这是对的,但我想这只是为了现在进行测试。
答案 1 :(得分:0)
我认为问题是link_
变量,它未在您的示例中分配,从未使用过......
答案 2 :(得分:-1)
除非在专门的课程中,否则你永远不应该使用原始指针。将它们更改为智能指针(在这种情况下将自动或共享)并且不必释放自己的内存 - &gt;问题解决了。 编辑:
更聪明的选择就是使用std :: list或std :: vector。