c++ - 虚拟类段错误

标签 c++ gdb segmentation-fault virtual-functions

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

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

  • 形状(虚拟类)
    • 矩形
    • 多边形
    • 圈子
  • 图片(本质上是形状的集合)

这是我的代码适用部分的简短拷贝:

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/

相关文章:

c++ - 在 C++ 中使用 #include<filename> 和 #include<filename.h> 的区别

linux - 为 valgrind 和 gdb 记录禁用 glibc (LD_HWCAP_MASK,/etc/ld.so.nohwcap) 中的 AVX 优化函数

c++ - 用户定义指针双端队列中的段错误

c - 段错误(核心转储)问题

c++ - C++0x 中的纯/常量函数

c++ - SFINAE 在评估模板参数中的 constexpr 时失败?

c++ - 在C++中使用 vector 实现堆栈

debugging - 在我知道进程 ID 之前将 gdb 附加到进程

c++ - 获取 GDB 便利变量中保存的值的符号信息

c - c二叉搜索树中的段错误11