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

我有一些框架可以从Lua脚本中显示,如下所示:

frm=MainFrame.new()

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

frm:add()

由于frm并不是nil,但是在C++中使用delete命令,已经在幕后删除,程序崩溃,因为Lua不知道这一点,它所引用的内存已经被删除。是否有一种方法使frm变量在从C++删除所引用的内存时变为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()
{
    //为简洁起见省略

    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);
    //让我们检查是否存在具有相同名称的Frame
    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() --即使主框架已关闭,它也返回

但是,当我运行:

frm:add()

程序崩溃,因为当主帧被用户关闭时,m_FrameList变量被删除。

点赞