2008年10月9日星期四

C++语言的一个违反直觉之处

6.2章,才发现这样一个陷井。
如下一段代码在gcc4.2下是可以触发Segmentation fault的,原因在于基类与派生类的大小不同。
#include

using namespace std;

class Point{
public:
Point(){
}
virtual ~Point();
};

Point::~Point(){
cout << "~Point" <
}

class PointImp:public Point{
int _x;
int _y;
public:
PointImp(){
cout << "PointImp" <
}
virtual ~PointImp();
};

PointImp::~PointImp(){
cout<< "~PointImp" <
}

int main(){
Point* p = new PointImp[10];
delete[] p;
return 0;
}

如果把PointImp中的成员int _x, int y移除,程序就好了。Lippman书上解释了一些内部实现的原因,不过我觉得还是可以使语言支持这样的操作更好,毕竟符合人的直觉。

没有评论: