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

标签 c++ list pointers crash

我正在开发一个 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/

相关文章:

c++ - 泛化返回基于对象和类方法的可调用函数的函数

c++ - 在 QNX Momentics 中为自定义构建配置定义自定义符号

c++ - 在循环构造函数调用中创建的对象的拷贝

python - 使用反斜杠将字符串列表转换为正确的目录名称

list - 递归拆分列表函数 LISP

用于类和结构之间交互的 C++ 语法

c - 打印结构

c++ - 具有常量值的任何模板化类型的类型特征

python - 如何将列表复制到 list2 的长度?

c - restrict 关键字有多严格?