将元素添加到列表崩溃程序...有时
Adding element to list crashes program...sometimes
我正在开发一个 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
}
Democlass中的相关代码在这里列出。
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 会产生相同的结果。尽管我很想提供有关此问题的更多信息,但我无法提供。任何人都可以深入了解为什么我的程序总是崩溃吗?
这是您创建对象的顺序。
你在Demo
的构造函数列表中调用了Demo
的基class(Application
)的构造函数和成员[=13=的构造函数].在 Demo
的构造过程中,首先构造基础 class,然后才按照声明的顺序构造 Demo
的其他成员 -first fsm
和只有在列表 m_draw_list
之后。
但是对于 fsm
的构造函数,您尝试将调用 MainMenuState
的构造函数的指针结果传递给最后一个 *this
并且是部分构造的 Demo
还没有列表的对象。所以在这个对[=22=]的调用中,你的程序的崩溃是为了使用一个未初始化的列表。
你必须考虑如何组织你的代码并防止对象创建的循环依赖。您可能需要将一些参数传递给已经完全创建的对象,例如在构造函数的主体内部,其中所有成员都已构造,包括列表,如 "works" 示例中的那样。在这种情况下,您也可以在 public fsm
.
之前声明私有列表 m_draw_list
我正在开发一个 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
}
Democlass中的相关代码在这里列出。
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 会产生相同的结果。尽管我很想提供有关此问题的更多信息,但我无法提供。任何人都可以深入了解为什么我的程序总是崩溃吗?
这是您创建对象的顺序。
你在Demo
的构造函数列表中调用了Demo
的基class(Application
)的构造函数和成员[=13=的构造函数].在 Demo
的构造过程中,首先构造基础 class,然后才按照声明的顺序构造 Demo
的其他成员 -first fsm
和只有在列表 m_draw_list
之后。
但是对于 fsm
的构造函数,您尝试将调用 MainMenuState
的构造函数的指针结果传递给最后一个 *this
并且是部分构造的 Demo
还没有列表的对象。所以在这个对[=22=]的调用中,你的程序的崩溃是为了使用一个未初始化的列表。
你必须考虑如何组织你的代码并防止对象创建的循环依赖。您可能需要将一些参数传递给已经完全创建的对象,例如在构造函数的主体内部,其中所有成员都已构造,包括列表,如 "works" 示例中的那样。在这种情况下,您也可以在 public fsm
.
m_draw_list