【问题标题】:c++ OpenGL Segmentation Faultc++ OpenGL分割错误
【发布时间】:2014-11-30 09:53:33
【问题描述】:

所以,这是我的代码的一部分。 我有一个名为Polygon 的类,它有一个数组来保存我的坐标。

class Polygon{
private:
    GLint Vertices[][2];


public:
    Polygon(){
        GLint** Vertices = new GLint*[20000];
        for (int j=0; j<20000; j++){
            Vertices[j] = new GLint[2];
        }
    }

    void setCoord(int m, GLint x, GLint y){
        Vertices[m][0] = x;
        Vertices[m][1] = y;
    }
};

我尝试编译我的代码,当我尝试将我的第一个坐标放入 setCoord() 函数的数组中时(当 m 为 0 时),我遇到了分段错误错误。

不知道为什么。希望你们会有所帮助。请不要告诉我有关向量的事情。我对这种技术不熟悉,而且我没有太多时间学习它,因为我的项目必须在 4 天内完成。

谢谢!

【问题讨论】:

  • 你应该添加一个至少删除它们的析构函数。

标签: c++ arrays class opengl segmentation-fault


【解决方案1】:
GLint** Vertices = new GLint*[20000];

Polygon() 构造函数中的局部变量声明,并隐藏您的 Vertices 类成员声明。构造函数返回后,那里分配的所有内容都会丢失(泄漏)。

您正在访问setCoord() 中未初始化的内存,因此它崩溃

通过以下方式更改顶点和构造函数的声明

class Polygon{
private:
    GLint** Vertices; // <<<<<< Change declaration


public:
    Polygon(){
        Vertices = new GLint*[20000]; // <<<<<< Remove GLint**
        for (int j=0; j<20000; j++){
            Vertices[j] = new GLint[2];
        }
    }
};

附注

“请不要告诉我有关向量的事情。我不熟悉这种技术,而且我没有太多时间学习它,因为我的项目必须在 4 天内完成。”

我认为使用std::vector&lt;&gt; 可能比自行解决和处理动态内存管理的所有障碍要容易得多。祝你好运!

【讨论】:

  • 关于最后一段:使用std::vector处理动态内存管理权:-)
  • 还是什么都没有。好的,这就是我想要做的。我想创建一个多边形数组 p。每个 p[i] (i=0,1,2,...) 都是一个多边形。我怎样才能做到这一点?我不知道该怎么做。我已经尝试了很多东西,但仍然没有。也许我还能做点别的事情。这是我很长一段时间以来的第一个 c++ 程序,也是我第一次使用 OpenGL。
  • @JamesCs15 你是什么意思“仍然没有”?我怀疑你可能会在这种风格的类中遇到很多其他错误,即使你修复了我提到的错误。考虑复制构造函数、赋值运算符等,这将很难正确管理。
  • @πάνταῥεῖ 我的意思是分段错误仍然存​​在。你建议我怎么做?
  • @JamesCs15 “你建议我做什么?”我已经做了:使用std::vector&lt;std::vector&lt;GLint&gt;&gt;
猜你喜欢
  • 1970-01-01
  • 2014-06-06
  • 2014-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多