我正在开发一个图形应用程序。它大量使用了虚拟类。我遇到了一些无法调试的段错误。
此应用程序中的主要类是:
- 形状(虚拟类)
- 矩形
- 多边形
- 圈子
- 图片(本质上是形状的集合)
这是我的代码适用部分的简短拷贝:
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 session :
Program terminated with signal 11, Segmentation fault. [New process 89330 ] #0 0x00020d38 in Rectangle::draw (this=0x41e10, g=@0xffbff904) at rectangle.cpp:42 42 g.setColor(getFillColor()); (gdb) print &g $1 = (class Graphics *) 0xffbff904 (gdb) bt #0 0x00020d38 in Rectangle::draw (this=0x41e10, g=@0xffbff904) at rectangle.cpp:42 #1 0x0001bae8 in Picture::draw (this=0xffbff950) at picture.cpp:45 #2 0x0002394c in writePicture (p= { = {_vptr.Figure = 0x2be38}, shapes = { >> = {_M_impl = {> = {> = {}, }, _M_start = 0x3f648, _M_finish = 0x3f664, _M_end_of_storage = 0x3f664}}, }, gfx = 0xffbff904}, fileName= {static npos = 4294967295, _M_dataplus = {> = {> = {}, }, _M_p = 0x3f49c "t1.dat.eps"}}) at testpicture.cpp:51 #3 0x00023b3c in simpleTest (inFileName= {static npos = 4294967295, _M_dataplus = {> = {> = {}, }, _M_p = 0x3fe24 "t1.dat"}}, outFileName= {static npos = 4294967295, _M_dataplus = {> = {> = {}, }, _M_p = 0x3f49c "t1.dat.eps"}}, bb=@0xffbff9c8) at testpicture.cpp:70 #4 0x00024c3c in main (argc=2, argv=0xffbffa74) at testpicture.cpp:165
I've been banging my head against the wall for a couple of hours now trying to figure this thing out. It has something to do with the Graphic member of the Picture class. However, I'm failing to see how it pieces together to create a segmentation fault.
EDIT:
Here is the portion of the testpicture.cpp where the Graphics object is created:
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 继承自它。
最佳答案
gfx 指向堆栈中的一个对象。当您尝试绘制时,您确定该对象仍然存在(与它所在的位置相同)吗?
关于c++ - 虚拟类段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2395000/