c++类中的指针被打乱了
Pointers in C++ Class are getting scrambled
我现在有一大堆代码快把我逼疯了。我正在使用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或其他替代方法。如果您在使用指针时遇到任何问题,这些工具将帮助您跟踪它们。
我怀疑你在某种程度上保留了一个按钮引用列表和一个图像引用列表,它们并不总是以相同的顺序创建,因此交叉图像。
严格地说,你应该按顺序创建按钮和它的图像,在创建时分配图像文件
- 尽管直接设置了指针数组,但仍为空
- 我是否在这个通用 unique_ptr<>() 删除器中正确使用了指针类?
- 变量参数列表 后面的'const std::string&'弄乱了堆栈
- 为什么此串行/调制解调器代码弄乱了我的终端显示
- std::move 返回值 weak_ptr::锁定弄乱了shared_ptr的引用计数?
- 当我初始化了指针属性 allready 时,如何将 QGraphicsItem 向下投射到创建的类?
- c++ std map 的擦除功能是否释放了指针键的内存?
- 如果在循环中声明了指针变量,则它是否与循环的每次传递都与相同的内存地址相关联
- 弄乱了OpenGL深度缓冲区
- qtextstream弄乱了其位置指针
- 为什么返回数据结构而不是指针弄乱了我的数据的完整性
- 河豚加密在加密和解密过程中弄乱了前 8 个字节
- 我丢失了指针或地址?它就像从未发生过一样
- 我在这里滥用了指针吗?虽然循环条件似乎无法正常工作
- 如何证明您传递了指针的所有权
- 对填充了指针的std::向量使用std:remove_if
- 我是否正确使用了指针和数组
- Qsort不工作-把数组完全搞乱了
- 整数类型弄乱了 sizeof(T)
- 我想我弄乱了这些指针的作用域,c++