【问题标题】:error: pointer being freed was not allocated错误:被释放的指针未被分配
【发布时间】:2010-08-15 14:53:30
【问题描述】:

我正在尝试重载赋值运算符以执行多边形对象的深层复制,程序编译但我在最后遇到了一个我想要清除的错误。以下是相关代码,如果您认为我需要添加更多内容,请发表评论。假设正确的 #include's 并且 << 运算符被重载以进行正确的输出等...

错误是: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 的析构函数中

修改:添加了分配link_的部分代码,setLink是一个简单的setter方法。

【问题讨论】:

  • 该错误似乎是在抱怨内存是如何被释放的,但是您目前没有显示任何这样做的代码。任何使用freedelete 的代码都可能与此错误非常相关。
  • @TheUndeadFish:我更新了问题,请参阅底部的编辑
  • 你在哪里分配link_变量?您的示例中缺少该部分代码。
  • @PC2st:我更新了,注意addPoint方法
  • 您是否实现了构造函数并将指针初始化为空?错误消息提示一个未初始化的指针。

标签: c++ xcode pointers operator-overloading


【解决方案1】:

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

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

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

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

Polygon& operator= (Polygon ply);

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

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

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

【讨论】:

  • link_ 被初始化为 NULL 不过这是个好主意。
  • @Jordan 那么复制构造函数呢?如果您没有正确定义一个对象,则某些对象会被删除两次。复制构造函数可能和赋值运算符一样复杂,可能稍微少一点。如果要先测试运算符,在复制构造函数之前,更改运算符的签名,以通过引用(const)传递参数。这样就不会使用复制构造函数了。
  • 我尝试按照我实现赋值运算符的方式实现复制构造函数(除了我没有return *this;)并且它起作用了。感谢您的帮助
【解决方案2】:

我认为问题在于link_ 变量,它没有在您的示例中分配,也从未使用过...

【讨论】:

    【解决方案3】:

    通常情况下,除非在专用类中,否则您永远不应该使用原始指针。将它们更改为智能指针(在这种情况下自动或共享)并停止释放您自己的内存->问题已解决。 编辑:

    更聪明的选择是使用 std::list 或 std::vector。

    【讨论】:

    • 我认为永远不会太强大。对容器的温和鼓励就足够了。
    • 我认为“从不,从...,通常”是一个非常令人困惑的建议!
    猜你喜欢
    • 1970-01-01
    • 2013-10-12
    • 2015-10-01
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多