我有很多代码让我现在真的很疯狂。 我正在使用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。我怀疑对于我正在努力完成的事情有一个更好的方法,我很欣赏这些方面的任何建议。
答案 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)
听起来像内存损坏。您应该考虑使用一些内存调试器,如valgrind或some other alternative。如果您在使用指针时遇到任何问题,这些工具将帮助您跟踪它们。
答案 3 :(得分:0)
我怀疑你是以某种方式保留按钮引用列表和图像引用列表,并且它们并不总是以相同的顺序创建,因此交叉图像。
严格来说,你应该按顺序创建一个按钮及其图像,在创建时分配图像文件。