gpt4 book ai didi

c++ - 在堆栈 C++ 上创建的对象中的无效数据

转载 作者:行者123 更新时间:2023-11-30 02:58:48 26 4
gpt4 key购买 nike

对于这个问题,我真的找不到更好的标题了。

我有三个类:CheckBoxButtonBackground

class CheckBox : public Component
{
private:
Button m_button;
public:
CheckBox(const Point &pos, int width, int height, std::string text);
CheckBox();
};

CheckBox::CheckBox(const Point &pos, int width, int height, string text) :
Component(pos, width, height),
m_button(Button(Point(width-height,0), new Background("button_bg_sample.png", true), new Background("button_bg_onclick_sample.png", true), height, height, 10, "")),
{

}


class Button : public Component
{
private:
std::string m_text;
Background* m_pBackground;
Background* m_pBackgroundOnClick;
int m_fontSize;
public:
Button(const Point& pos, Background* pBg, Background* pBgOnClick, int width, int height, int fontSize, std::string title);
~Button();

};

Button::Button(const Point& pos, Background* pBg, Background* pBgOnClick, int width, int height, int fontSize, string title) :
Component(pos, width, height),
m_pBackground(pBg),
m_pBackgroundOnClick(pBgOnClick),
m_fontSize(fontSize),
m_text(title)
{
}


class Background
{
private:
std::string m_pFileName;
bool m_bTiling;
std::vector<unsigned char> m_pImageData;
unsigned int m_width;
unsigned int m_height;
GLuint m_texture;

bool load(const std::string& pFileName);
public:
Background(const std::string& pFileName, bool bTiling);
~Background();

bool draw(const Point &pos, unsigned int width, unsigned int height);
bool draw(const Point &pos);
};

Background::Background(const string& pFileName, bool bTiling) :
m_bTiling(bTiling),
m_pFileName(pFileName)
{
load(pFileName);
}

如您所见,CheckBox 类包含Button m_buttonButton 类包含Background* m_pBg。在 Background 构造函数中,我加载图像数据并将其存储在 std::vector 中,这并不重要 - 我知道它在工作,因为它已经过检查。

当我创建 CheckBox 对象时,它的 m_button 中的数据已损坏。当我尝试在 Debug模式下检查图像数据中的内容时,我得到的信息是它是空的,并且该背景的文件名为 "Error reading characters in string"。虽然当我在 Debug模式下逐步查看代码时,我已经看到数据已正确加载到构造函数中,但不知何故,当创建对象时,数据已经损坏。

当我将 CheckBox 类中的 m_button 字段更改为在堆上创建时(指向 Button 的指针,使用 创建的对象new 运算符)一切似乎都运行良好。数据正在正确加载并保持这样。

谁能解释一下这个问题的原因是什么?

最佳答案

问题是你没有遵守the rule of three .

Button 类自行管理内存,因此当您创建拷贝或进行分配时,您可能会遇到麻烦。我没有深入研究代码,所以不能确定这是根(尽管如此,这是一个问题),但我很确定它是。

如果您使用智能指针而不是原始指针来管理资源,这一切都可以避免。

关于c++ - 在堆栈 C++ 上创建的对象中的无效数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13457871/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com