我正在开发一个图形应用程序。它大量使用了虚拟类。我遇到了一些无法调试的分段错误。
此应用程序中的主要类是:
- 形状(一个虚拟类)
- 长方形
- 多边形
- 圆圈
- 图片(本质上是形状的集合)
这是我的代码适用部分的简短副本:
class Picture
{
...
Picture(Graphics& gd)
{
gfx = &gd;
}
void Picture::draw() const
{
for(int i=0; i<shapes.size();i++)
{
shapes[i]->draw(*gfx); // This line causes a segmentation fault
}
}
...
private:
std::vector<Shape*> shapes;
Graphics* gfx;
}
class Shape
{
...
virtual void draw(Graphics& g) const = 0;
...
}
这是一个显示一些信息的 gdb 会话:
程序以信号 11 终止,分段错误。 【新工艺89330】 #0 0x00020d38 in Rectangle::draw (this=0x41e10, g=@0xffbff904) 在矩形.cpp:42 42 g.setColor(getFillColor()); (gdb) 打印 &g $1 = (类图形 *) 0xffbff904 (gdb) BT #0 0x00020d38 in Rectangle::draw (this=0x41e10, g=@0xffbff904) 在矩形.cpp:42 #1 0x0001bae8 in Picture::draw (this=0xffbff950) at picture.cpp:45 #2 0x0002394c 在 writePicture (p= { = {_vptr.Figure = 0x2be38},形状 = { >> = {_M_impl = {> = {> = {},},_M_start = 0x3f648,_M_finish = 0x3f664,_M_end_of_storage = 0x3f664}},},gfx = 0xffbff904} , 文件名= {静态 npos = 4294967295, _M_dataplus = {> = {> = {}, }, _M_p = 0x3f49c "t1.dat.eps"}}) 在 testpicture.cpp:51 #3 0x00023b3c 在 simpleTest (inFileName= {静态 npos = 4294967295, _M_dataplus = {> = {> = {}, }, _M_p = 0x3fe24 "t1.dat"}}, outFileName= {静态 npos = 4294967295, _M_dataplus = {> = {> = {}, }, _M_p = 0x3f49c "t1.dat.eps"}}, bb=@0xffbff9c8) 在 testpicture.cpp:70 #4 0x00024c3c in main (argc=2, argv=0xffbffa74) at testpicture.cpp:165
我已经把头撞在墙上几个小时了,现在试图弄清楚这件事。它与 Picture 类的 Graphic 成员有关。但是,我看不到它是如何拼凑起来产生分段错误的。
编辑:
这是 testpicture.cpp 中创建 Graphics 对象的部分:
RectangularArea getPictureBounds (string fileName)
{
ifstream in (fileName.c_str());
PSGraphics gr(fileName + ".bb");
Picture p0(gr);
Shape* shape;
while (in >> shape)
{
if (shape != NULL)
p0.add(*shape);
}
return p0.boundingBox();
}
Graphic 也是一个虚拟类。在这种情况下,PSGraphic 继承自它。