Lua跟踪来自C ++的用户数据的状态

时间:2016-08-12 23:01:02

标签: c++ lua

我有可以从Lua脚本显示的帧,如下所示:

frm=MainFrame.new()

当用户运行此命令时,会弹出一个框架并显示。 Frame类具有成员函数,例如addclose。现在没有运行frm:close(),用户也可以点击窗口的关闭按钮,从而关闭窗口。执行此操作后,如果用户运行以下命令:

frm:add()

程序因内存违规而崩溃,因为frm不是nil,而是使用delete命令从C ++后台删除。但是,Lua并没有意识到这一点,它在内存中的含义已被删除。当从C ++中删除它所引用的内存时,有没有办法使frm变量nil成为可能。

顺便说一下,用户可以运行frm1=Frame.new()frm2=Frame.new(),其中frm1frm2都是Frame类型,但假设只有frm1被关闭单击窗口关闭按钮,因此只从C ++端删除frm1

我在Windows 10上使用tdm-gcc mingw 4.8.1,因此常规trycatch块无助于捕获内存违规。

编辑1:

Lua包装:

int MainFrame_NumberofFrames(lua_State* L)
{
    MainFrame* mframe= luaW_check<MainFrame>(L, 1);
    int NumWorkSheets=0;
    NumFrames=mframe->GetNumberOfFrames();
    lua_pushnumber(L,NumFrames);
    return 1;
}

int MainFrame_AddNewFrame(lua_State* L)
{
    int nargs=lua_gettop(L);

    MainFrame* mframe= luaW_check<MainFrame>(L, 1);
    if(nargs==1){
    if(!mframe->AddNewFrame(wxEmptyString)) luaL_error(L,"Unexpected error occurred");
    }

内部C ++代码:

MainFrame::~MainFrame()
{
    //Omitted for brevity

    if(m_FrameList) {delete m_FrameList; m_FrameList=0;}
}

bool MainFrame::AddNewFrame(const wxString& tblname, int nrows, int ncols)
{
    m_NumberofFrames++;
    wxString TableLabel=tblname;
    if(TableLabel.IsEmpty())  TableLabel=_T("Frame")+wxString::Format(wxT("%i"),m_NumberofFrames);
    //Let's check if Frame with the same name exists
    if(!TableLabel.IsEmpty()){
        for(unsigned int i=0;i<m_FrameList->Size();i++){
        Frame* subframe=m_FrameList->GetEntry(i);
        if(subframe->GetName()==TableLabel) return false;
    }
 }

如果我跑:

frm:count() --It returns even though the main frame is closed

然而,当我跑步时:

frm:add() 

当用户关闭主框架时,当m_FrameList变量被删除时程序崩溃。

0 个答案:

没有答案