C ++类中的指针正在被扰乱

时间:2011-10-26 14:32:03

标签: c++ class opengl pointers

我有很多代码让我现在真的很疯狂。 我正在使用OpenGL,构建一个使用几种不同类型对象的GUI框架。我有Image类加载* .png文件并以GLuint纹理参考的形式存储图像信息。我有Panel和Button类,指向它们应该显示的图像类。我有一个带有Panel和Button指针的std ::向量的Hud类。最后,我有一个Engine类,它包含一个Hud类,我的所有Button和Panel类,以及Image指针。运行构造函数时,每个Image指针都使用以下命令初始化:

imgMy = new Image;

初始化完所有图像后,我运行加载功能:

imgMy->loadImage("imgMy.png");

当然,我在关闭程序时会删除图像。

我的问题是有些图像正在“交叉”。我现在有大约30张图片,而且有几个按钮显然指向了错误的图像。我彻底检查了我的代码,看起来很稳固。我相信这是一个内存错误,因为显示错误图像的按钮不一致。有时他们会显示正确的图像,有时不同的按钮会显示错误的图像。我希望我能在这里展示我的代码,但它非常庞大。

我在Engine类中使用Image指针而不是实际的Image对象的原因是,如果Engine类调整大小或重新安排其内存,我害怕指向无效内存的Buttons。我怀疑对于我正在努力完成的事情有一个更好的方法,我很欣赏这些方面的任何建议。

4 个答案:

答案 0 :(得分:2)

使用调试器,您可以将监视点放在相关的imgMy上,然后调试器会告诉您它们的修改位置。这可能是追踪它的最简单方法。

您可能还想尝试valgrind,但这听起来不像valgrind会发现的问题类型。

答案 1 :(得分:2)

首先,如果没有充分的理由,不应该使用两阶段初始化。这不是一个很好的理由。在构造函数中传递文件名。此外,始终使用智能指针。

您只需使用const来强制执行即可。

class Button {
    const std::unique_ptr<Image> img;
public:
    Button(std::string filename)
        : img(new Image(filename)) {}
};

其次,我不太了解你的压倒一切的架构,因为你没有详细描述它,但我不确定new在这里是否需要。

答案 2 :(得分:0)

听起来像内存损坏。您应该考虑使用一些内存调试器,如valgrindsome other alternative。如果您在使用指针时遇到任何问题,这些工具将帮助您跟踪它们。

答案 3 :(得分:0)

我怀疑你是以某种方式保留按钮引用列表和图像引用列表,并且它们并不总是以相同的顺序创建,因此交叉图像。

严格来说,你应该按顺序创建一个按钮及其图像,在创建时分配图像文件。