c++类中的指针被打乱了

Pointers in C++ Class are getting scrambled

本文关键字:乱了 指针 c++      更新时间:2023-10-16

我现在有一大堆代码快把我逼疯了。我正在使用OpenGL,构建一个使用几种不同类型对象的GUI框架。我有图像类加载*.png文件,并以GLuint纹理引用的形式存储图像信息。我有面板和按钮类与指针的图像类,他们应该显示。我有一个Hud类的std::面板和按钮指针向量。最后,我有一个引擎类,它包含一个Hud类,所有我的按钮和面板类,以及图像指针。当构造函数运行时,使用

初始化每个Image指针:
imgMy = new Image;

一旦所有的图像都被初始化,我就运行加载函数:

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

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

我的问题是有些图像被"交叉"了。我现在有大约30张图片,有几个按钮显然指向了错误的图片。我已经彻底检查了我的代码,它看起来是可靠的。我认为这是一个内存错误,因为显示不正确图像的按钮不一致。有时它们显示正确的图像,有时不同的按钮显示错误的图像。我希望我能在这里展示我的代码,但是它太大了。

我在我的引擎类中使用图像指针而不是实际的图像对象的原因是,我害怕按钮指向无效的内存,如果引擎类被调整大小,或者它的内存重新排列。我怀疑有更好的方法来完成我正在努力完成的任务,我将非常感谢任何关于这方面的建议。

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

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

首先,除非有充分的理由,否则不应该使用两阶段初始化。这不是一个很好的理由。在构造函数中传递文件名。另外,一定要使用智能指针。

您可以简单地使用const来执行它。

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

其次,我不太了解您的覆盖架构,因为您没有详细描述它,但我不确定这里是否需要new

听起来像是内存损坏。您应该考虑使用一些内存调试器,如valgrind或其他替代方法。如果您在使用指针时遇到任何问题,这些工具将帮助您跟踪它们。

我怀疑你在某种程度上保留了一个按钮引用列表和一个图像引用列表,它们并不总是以相同的顺序创建,因此交叉图像。

严格地说,你应该按顺序创建按钮和它的图像,在创建时分配图像文件