1

想象一下它的构造函数的简单类线段是来自类点的几个对象:

class Point ;

class LineSegment {
    public:

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

问题是,在析构函数中,我应该先删除点还是自动完成?换言之,在 cpp 文件中,应写入以下哪一项:

LineSegment::~LineSegment()

或者

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

2 回答 2

4

首先,请注意

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

是无效的。要删除,您需要delete P1delete P2

此外,找出谁拥有P1P2。如果它们归类所有,请在析构函数中删除它们,但请注意,在对象被销毁后,您将无法在外部访问它们。

因此,例如:

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

{
   LineSegment l(p1,p2);
}

delete p1;
delete p2;

如果你delete在析构函数中使用指针,那将是非法的。

无论您选择哪个版本,请务必记录您的决定——即明确该类是否承担指针的所有权

如果你使用智能指针,你就不会遇到这个问题。

于 2012-06-06T08:52:54.753 回答
2

要删除它们,您必须使用 delete 运算符,这样:

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

这样做会调用 P1 和 P2 的析构函数

自动删除点的唯一方法是将它们按值作为类的成员:

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

通过这样做,当 LineSegment 被删除时,P1 和 P2 将被自动销毁。

于 2012-06-06T08:53:13.627 回答