想象一下简单的类线段,它的构造函数是来自类点的几个对象:
class Point ;
class LineSegment {
public:
LineSegment(Point* P1, Point* P2);
~LineSegment();
} ;
问题是,在析构函数中,我应该先删除这些点还是自动完成?换句话说,在cpp文件中,应该写下以下哪一项:
LineSegment::~LineSegment()
或
LineSegment::~LineSegment(){
delete P1;
delete P2;
}
答案 0 :(得分:4)
首先,请注意
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
析构函数中的指针,那将是非法的。
您选择的任何一个版本,请务必记录您的决定 - 即明确该类是否承担指针的所有权。
如果您使用智能指针,则不会出现此问题。
答案 1 :(得分:2)
要删除它们,您必须使用delete运算符:
LineSegment::~LineSegment(){
delete P1;
delete P2;
}
这样做会调用P1和P2的析构函数
自动删除点的唯一方法是按值将它们作为类的成员:
class LineSegment {
protected:
Point P1;
Point P2;
public:
/* constructors and destructors */
};
通过这样做,当LineSegment被删除时,P1和P2将被自动销毁。