gpt4 book ai didi

c++ - 错误 : pointer being freed was not allocated

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:36:27 25 4
gpt4 key购买 nike

我正在尝试重载赋值运算符以执行多边形对象的深拷贝,程序编译但我在接近尾声时收到错误,我想清除。以下是相关代码,如果您认为我需要添加更多内容,请发表评论。假设适当的 #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
};<p></p>

<p>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
};</p>

//Polygon.cpp
...
PolygonNode::~PolygonNode()
{
delete link_ ; // possible problem area<br/>
}<p></p>

<p>Polygon::~Polygon()
{
delete first_ ; // possible problem area
last_ = NULL ;
}</p>

<p>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 <em>this;
}
void Polygon::addPoint(const Point &p)
{
PolygonNode</em> 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_++ ;
}
...</p>

//main.cpp
Polygon ply;
...
Point pt0(0,0);
Point pt1(1,1);<p></p>

<pre><code> 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;
</code></pre>

<p>...
</p>

我在别处读到这可能是由于 OS 10.6 或 Xcode 3.2 中的错误,如果有解决方法,有人可以给我详细的说明来解决这个问题吗,我对 Xcode 没有太多经验.

已编辑:添加了使用 delete 的部分代码,注意它被用在 Polygon 和 PolygonNode 的析构函数中

已编辑:添加分配 link_ 的代码部分,setLink 是一个简单的 setter 方法。

最佳答案

我看不到 PolygonNode 类的构造函数。 link_ 指针是否在创建时初始化为 null?如果不是,那可能是您收到的错误中出现的问题。您必须确保 PolygonNode 实例中的 link_ 指针被初始化为 null。定义适当的构造函数。

您是否为多边形类定义了复制构造函数?我在发布的代码中看不到一个,但也许你只是没有粘贴它而你有一个。如果不是,那就是严重问题的可能来源之一。

由编译器自动合成的复制构造函数只会复制 Polygon 类中的指针。

您的赋值运算符按值获取参数

Polygon& operator= (Polygon ply);

这利用了复制构造函数。如果它是自动合成的,运算符内部的 ply 有指向同一个列表的指针,按值传递给运算符的参数拥有。 ply 的行为就像它也拥有该列表,当 ply 超出范围时该列表将被销毁。原始参数留下悬空指针。

您应该定义正确的复制构造函数。

您还应该考虑通过 const 引用获取赋值运算符中的参数。我看不出有理由按值(value)来看待它。也许你有一个,但即使你有,你也可以在定义正确的复制构造函数之前临时更改它以测试运算符。在您的运算符(operator)中,您应该检查 self 分配。我现在所能看到的是向旧的 Polygon 添加新节点。我认为这不对,但我想现在只是为了测试。

关于c++ - 错误 : pointer being freed was not allocated,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3487870/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com