繁体   English   中英

虚拟类分段错误

[英]Virtual Classes Segmentation Faults

我正在开发一个图形应用程序。 它大量使用虚拟类。 我遇到了一些我在调试时遇到问题的分段错误。

此应用程序中的主要类是:

  • 形状(虚拟类)
    • 长方形
    • 多边形
  • 图片(基本上是形状的集合)

以下是我的代码的适用部分的缩写副本:

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会话:

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

现在我已经把头撞在墙上几个小时了,现在想把这件事弄清楚。 它与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继承了它。

gfx指向堆栈中的对象。 当你试图绘制时,你确定对象仍在那里(在它的同一位置)吗?

将指针存储给作为参考的参数是不好的做法 - 这会造成对内存所有权的混淆。 要么创建引用对象的副本(如果它是类),要么更改方法以将智能指针 (如boost::shared_ptr )带到共享资源。 这样资源所有权管理是明确的。

对于您的直接问题 - Graphics实例可能在堆栈上分配并超出范围,因此被破坏。 然后你的Picture代码引用死对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM