Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 析构函数中Lua绑定的单例类崩溃_C++_Lua_Singleton_Segmentation Fault_Luabind - Fatal编程技术网

C++ 析构函数中Lua绑定的单例类崩溃

C++ 析构函数中Lua绑定的单例类崩溃,c++,lua,singleton,segmentation-fault,luabind,C++,Lua,Singleton,Segmentation Fault,Luabind,我第一次使用Lua&luabind,我一直在想下面的问题。如果我在C++中声明一个Stutelon类,并将它绑定到Lua,在那里我得到它的实例并调用一些方法,哪个语言实际上拥有实例? 我想知道的原因是,目前我的程序偶尔会在我的singleton类的析构函数中出现segfault。Lua是否在实例被破坏后尝试对其进行垃圾收集?如果是,我如何防止它这样做?声明如下: public: static App* GetInstance(); ~App();

我第一次使用Lua&luabind,我一直在想下面的问题。如果我在C++中声明一个Stutelon类,并将它绑定到Lua,在那里我得到它的实例并调用一些方法,哪个语言实际上拥有实例? 我想知道的原因是,目前我的程序偶尔会在我的singleton类的析构函数中出现segfault。Lua是否在实例被破坏后尝试对其进行垃圾收集?如果是,我如何防止它这样做?声明如下:

public:
        static App* GetInstance();
        ~App();
        void Execute();

    private:
        App();
我在卢阿打电话

app = App.getInstance()
app:execute()
当一切都结束后,它崩溃了。这里到底发生了什么

luabind看起来像这样(省略了很多属性)

模块(L,“nge”)
[
类别("应用程序")
范围
[
def(“getInstance”,&App::getInstance)
]
.def(“执行”&应用程序::执行)
]

您应该注意生命周期,因为您返回的是裸指针。Luabind可能正在删除您的实例。也许您应该为您的实例切换到使用共享的ptr。Luabind可以做到这一点:。在这方面有一个很好的章节,这可能有助于理解问题。

析构函数实际上做什么?谁删除
应用程序
实例?实例被删除后是否调用了lua函数?这也是我想知道的。
app:execute()
之后不会调用任何内容。您是否已尝试在应用程序中调试以查看其崩溃的位置?定义了空析构函数后,析构函数中的程序segfaults。如果没有析构函数,调试器会说segfault信号是在构造函数的右括号处接收到的。这会适用于单例类吗?因此,我不是在Lua中创建对象(我不调用
App()
),我只是得到
getInstance()
返回的指针。不过,这是一个好主意,接下来我将尝试使用智能指针!是的,那应该行得通。Luabind被“配置”为在任何创建boost::shared_ptr的地方正确使用它—在Luabind本身或外部。只要确保一致性,将实例初始化为共享的ptr,我的
GetInstance()
现在返回
boost::shared\u ptr
,我用
class(“App”)
将类绑定到Lua,但它仍然在析构函数中崩溃。真正奇怪的是,它并不总是在析构函数中崩溃,有时程序会正常关闭。您是否也将单例实例保存在boost::shared_ptr中?我将单例初始化为
static boost::shared_ptr instance(new App());返回实例
module(L, "nge")
[
        class_<App>("App")
            .scope
            [
                def("getInstance", &App::GetInstance)
            ]
            .def("execute", &App::Execute)
]