gpt4 book ai didi

c++ - 添加元素到列表会导致程序崩溃...有时

转载 作者:行者123 更新时间:2023-12-01 17:27:02 25 4
gpt4 key购买 nike

我正在开发一个 GUI 项目,由于某种原因,以下调用 add_gfx_object() 导致我的程序崩溃。

MainMenuState::MainMenuState(Demo& demo)
: m_start_button{new Button(Sol::Rectangle{Sol::Vector{10, 10}, 100, 30},
[] {std::cout << "clicked";})}
{
demo.add_gfx_object(m_start_button); // <-- crashes program
}
<小时/>

此处列出了 Demo 类中的相关代码。

class Demo : public Sol::Application
{
public:
StateMachine<Demo> fsm;

Demo();
~Demo();

//...

void add_gfx_object(const GraphicalEntity* const obj) {m_draw_list.push_back(obj);}

private:
std::list<const GraphicalEntity*> m_draw_list;

void draw_objects();
};
<小时/>

奇怪的是,对 add_gfx_object() 的调用不会使我的程序崩溃。

Demo::Demo()
: Application("Demo", 800, 600, false), fsm(*this, new MainMenuState(*this))
{
add_gfx_object(new Button(Sol::Rectangle(), []{})); // <-- does not crash program
}

在这些示例中将 Button 指针替换为 nullptr 会产生相同的结果。尽管我很想提供有关该问题的更多信息,但我无法提供。任何人都可以深入了解为什么我的程序不断崩溃吗?

最佳答案

这是您创建对象的顺序。

您调用 Application 的基类 ( Demo ) 的构造函数在 Demo 的构造函数列表中以及成员 fsm 的构造函数。施工期间Demo ,首先构造基类,然后才构造 Demo 的其他成员按照声明的顺序构造 -first fsm在此之后,列表 m_draw_list

但是对于 fsm 的构造函数您尝试将调用的指针结果传递给 MainMenuState 的构造函数传到最​​后*this with 是部分构造的 Demo还没有列表的对象。所以在这个对 MainMenuState(Demo& demo) 的调用中程序崩溃的原因是使用未初始化的列表。

您必须考虑如何组织代码并防止对象创建的循环依赖。您可能需要将一些参数传递给已经完全创建的对象,例如在构造函数的主体内,其中所有成员都已构造,包括列表,就像“有效”的示例中一样。在这种情况下,您也可以声明私有(private)列表 m_draw_list在公众面前fsm .

关于c++ - 添加元素到列表会导致程序崩溃...有时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47184824/

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