【问题标题】:C++ crashes when printing variable declared in header打印标题中声明的变量时,C++ 崩溃
【发布时间】:2012-08-10 19:21:57
【问题描述】:

我正在 c++ 中创建一个 Camera 类,用于 OpenGL。当我尝试打印在Camera.h 中声明的任何变量时,程序崩溃。但是如果我设置或获取变量的值它不会崩溃我做错了什么?

相机.h

    #ifndef CAMERA_H
    #define CAMERA_H

    class Camera
    {
        public:
            Camera();
            Camera(float xP, float yP, float zP);
            void move(float x, float y, float z);

        protected:
        private:
            float xPos, yPos, zPos;
    };

    #endif // CAMERA_H

Camera.cpp

    #include "Camera.h"
    #include <iostream>
    #include <GL/glut.h>

    using namespace std;

    Camera::Camera()
    {
    }

    Camera::Camera(float xP, float yP, float zP)
    : xPos(xP), yPos(yP), zPos(zP)
    {
    }

    void Camera::move(float x, float y, float z)
    {
        glTranslatef(-x, -y, -z);
        //None of this crashes:
        xPos = 1;
        yPos = xPos;
        //Crashes here:
        cout << "mainCamera x = " << xPos << endl;
    }

我收到的崩溃消息是:

opengl.exe 遇到问题需要关闭。给您带来的不便,我们深表歉意。


编辑

如果我将float xPos, yPos, zPos; 放在Camera.h 的公共部分,然后调用

    Camera mainCamera(0.0f, 0.0f, 0.0f);
    cout << "mainCamera x = " << mainCamera.xPos << endl;

...在main.cpp 中,它可以正常工作并打印:

主摄像头 x = 0

【问题讨论】:

  • 它是如何崩溃的?你得到什么错误?在哪里,在程序的哪一行?你能说明你是如何调用移动函数的吗?
  • 您可能应该在Camera::Camera() 构造函数中初始化xPosyPoszPos 的值。可能是0。 C++ 不保证数值变量从0 开始。不过,这不应该导致崩溃。
  • 问:你在哪个平台上?视窗? Linux?还有什么?问:您是从终端会话还是命令提示符运行?你甚至可以在你的程序环境中做终端输出(“cout/printf”)吗?问:你们有调试器(MSVS 或 gdb)吗?
  • 由于您是 C++ 新手,我的第一个建议是学习如何使用调试器来逐步执行代码并检查变量值。
  • 我怀疑 OpenGL 初始化有问题,因此glTranslatef 将结果矩阵写入不应该的地方,导致内存损坏。这不需要直接影响 Camera 实例 - 例如cout 实现或堆可能已损坏。如果这是真的,我们需要查看初始化代码,我们还需要一个 OpenGL 专家(我不是)。

标签: c++ opengl header crash runtime-error


【解决方案1】:

好吧,我想通了。而这个是一个愚蠢的。我忘了在Main.cpp 中包含windows.h,出于某种奇怪的原因,它阻止了浮点数被打印出来(???)。现在完美运行。

#include <windows.h>

【讨论】:

  • 这不是问题。我的猜测是你的代码中的其他地方有一个微妙的错误导致内存损坏。虽然更改代码可能会延迟问题的出现,但这不是解决办法。
  • 我已经从 C++ 程序中打印了大量不#include &lt;windows.h&gt; 的浮点数。包含的某些内容可能导致程序内存布局被更改,因此内存损坏仍在发生,但以非致命的方式 - 但是当其他更改再次修改内存布局时,症状可能会在以后再次出现。我不会完全否定包含它真正解决问题的机会,但这会有点奇怪。
  • According to this - “因为 OpenGL 是独立于平台的,所以没有标准的方法来初始化 OpenGL;每个平台处理它的方式不同。”和“如果您使用 OpenGL 的 C/C++ 语言绑定,那么强烈建议您使用窗口工具包来管理此任务。”。我在 C++(字面意思是一个多边形)中使用 OpenGL 玩了非常少量,我使用了wxWidgets。一个小麻烦 - 你必须使用 USE_OPENGL=1 构建 wxWidgets。
  • 其实阅读this bit,OpenGL中有一定的WTF。 “对于您熟悉的大多数库,您只需#include 一个头文件,确保将一个库链接到您的项目或 makefile,这一切都可以正常工作。OpenGL 不能那样工作。” (我的重点)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多