Форвард декларации и деструкторы

Представьте себе простой сегмент класса, который является его конструктором, это пара объектов из класса:

class Point ;

class LineSegment {
    public:

      LineSegment(Point* P1, Point* P2);
      ~LineSegment();
} ;

Вопрос в деструкторе: нужно ли сначала удалять точки или это будет сделано автоматически? Другими словами, в файле cpp, что из следующего должно быть записано:

LineSegment::~LineSegment()

или же

LineSegment::~LineSegment(){
     delete P1;
     delete P2;
}

2 ответа

Решение

Во-первых, обратите внимание, что

LineSegment::~LineSegment(){
     ~P1();
     ~P2();
}

является недействительным. Чтобы удалить, вам нужно delete P1 а также delete P2,

Также выясните, кому принадлежит P1 а также P2, Если они принадлежат классу, удалите их в деструкторе, но учтите, что после уничтожения объекта вы не сможете получить к ним доступ снаружи.

Так, например:

Point* p1 = new Point;
Point* p2 = new Point;

{
   LineSegment l(p1,p2);
}

delete p1;
delete p2;

Было бы незаконно, если вы delete указатели в деструкторе.

Любая версия, которую вы выберете, обязательно документирует ваше решение - т.е. проясните, предполагает ли класс владение указателями или нет.

У вас не было бы этой проблемы, если бы вы использовали умные указатели.

Чтобы удалить их, вы должны использовать оператор удаления следующим образом:

LineSegment::~LineSegment(){
     delete P1;
     delete P2;
}

Это вызовет деструктор P1 и P2.

Единственный способ автоматически удалить точки - это получить их по значению в качестве члена класса:

class LineSegment {
protected:
    Point P1;
    Point P2;
public:
    /* constructors and destructors */
};

При этом, когда LineSegment удаляется, P1 и P2 будут уничтожены автоматически.

Другие вопросы по тегам