ошибка: освобожденный указатель не выделен - PullRequest
2 голосов
/ 15 августа 2010

Я пытаюсь перегрузить оператор присваивания, чтобы сделать глубокую копию объекта многоугольника, программа компилируется, но в конце я получаю сообщение об ошибке, которое хочу устранить. Ниже приведен соответствующий код, если вы считаете, что мне нужно добавить больше, просто оставьте комментарий. Предположим, что правильные значения #include и оператор << перегружены для правильного вывода и т. Д. *

Ошибка: malloc: * ошибка для объекта 0x1001c0: освобожденный указатель не выделен * установить точку останова в malloc_error_break для отладки.

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

<code>//Polygon.cpp
...
PolygonNode::~PolygonNode()
{
    delete link_ ; // possible problem area<br>
}</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_++ ;
        }
...

//main.cpp
Polygon ply;
...
        Point pt0(0,0);
        Point pt1(1,1);</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;

...

Я читал в другом месте, что это возможно из-за ошибки в OS 10.6 или Xcode 3.2, если есть обходной путь, может кто-то дать мне подробные инструкции о том, как сделать обходной путь, у меня нет большого опыта работы с Xcode .

Отредактировано: добавлены части кода, которые используют delete, обратите внимание, что он используется в деструкторах для Polygon и PolygonNode

Отредактировано: добавлена ​​часть кода, где размещается link_, setLink - простой метод установки.

Ответы [ 3 ]

2 голосов
/ 15 августа 2010

Я не вижу конструктора для класса PolygonNode. Указатель link_ инициализируется нулем при создании? Если нет, то это может быть проблема, проявляющаяся в ошибке, которую вы получаете. Вы должны убедиться, что указатели link_ в экземплярах PolygonNode инициализируются нулем. Определите соответствующие конструкторы.

У вас есть конструктор копирования, определенный для вашего класса полигонов? Я не вижу ни одного в опубликованном коде, но, возможно, вы просто не вставили его, и он у вас есть. Если нет, то это один из возможных источников серьезных проблем.

Конструктор копирования, который автоматически синтезируется компилятором, просто скопирует указатели в классе Polygon.

Ваш оператор присваивания принимает аргумент по значению

Polygon& operator= (Polygon ply);

Это использует конструктор копирования. Если это автоматически синтезированный, ply внутри оператора имеет указатели, указывающие на тот же список, аргумент, передаваемый по значению оператору. ply ведет себя так, как если бы он владел списком, и список уничтожается, когда ply выходит из области видимости. Оригинальный аргумент оставлен с висячими указателями.

Вы должны определить правильный конструктор копирования.

Вам также следует рассмотреть возможность получения аргумента в операторе присваивания по ссылке const Я не вижу смысла принимать это по значению. Может быть, у вас есть, но даже если вы делаете, вы можете временно изменить его, чтобы проверить оператор, прежде чем определить правильный конструктор копирования. В вашем операторе вы должны проверить для самостоятельного назначения. Теперь я вижу только добавление новых узлов к старому Polygon. Я не думаю, что это правильно, но я думаю, что это только для тестирования сейчас.

0 голосов
/ 15 августа 2010

Я думаю, что проблема в переменной link_, она не выделена в вашем примере и никогда не использовалась ...

0 голосов
/ 15 августа 2010

Вы никогда не должны использовать сырые указатели, кроме как в специальном классе, как правило. Измените их на интеллектуальный указатель (в этом случае подойдет auto или shared) и прекратите освобождать собственную память -> проблема решена. Edit:

Более разумный вариант - просто использовать std :: list или std :: vector.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...