我有可以从Lua脚本显示的帧,如下所示:
frm=MainFrame.new()
当用户运行此命令时,会弹出一个框架并显示。 Frame类具有成员函数,例如add
,close
。现在没有运行frm:close()
,用户也可以点击窗口的关闭按钮,从而关闭窗口。执行此操作后,如果用户运行以下命令:
frm:add()
程序因内存违规而崩溃,因为frm
不是nil
,而是使用delete
命令从C ++后台删除。但是,Lua并没有意识到这一点,它在内存中的含义已被删除。当从C ++中删除它所引用的内存时,有没有办法使frm
变量nil
成为可能。
顺便说一下,用户可以运行frm1=Frame.new()
和frm2=Frame.new()
,其中frm1
和frm2
都是Frame类型,但假设只有frm1
被关闭单击窗口关闭按钮,因此只从C ++端删除frm1
。
我在Windows 10上使用tdm-gcc mingw 4.8.1,因此常规try
和catch
块无助于捕获内存违规。
编辑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
变量被删除时程序崩溃。