2016-04-13 68 views
2

所以我有一個類來處理Lua腳本作爲遊戲的一部分。以下是添加腳本以在每次迭代中運行的功能以及同時運行的其他許多其他腳本的功能。無法訪問堆棧頂部

void create(string script, void *obj, map<string, Tools::lua_function> flist) // void *obj is a (Tools::LuaScript) casted to void* 

它存儲在地圖如下:

map<string, pair<lua_State*, void*> > lua_states; 

的創建函數只是用來加載腳本並註冊的功能列表,然後存儲在lua_states[n]->first lua的狀態和指針類通過在每次迭代,然後通過這個地圖循環,並呼籲調用LuaHandler::run()處理腳本上void *obj(從工具:: LuaScript類派生)到lua_states[n]->second

現在我用這個,因爲scriptvoid*反對鑄造到lua腳本類。

class LuaScript { 
    public: 
     virtual void run(lua_State*) = 0; 
     virtual void render() = 0; 
     virtual bool req_update() = 0; 
}; 

爲了澄清,該script->run()呼籲有關與所需的變量等更新腳本,腳本文件中的類......,這是該設置的整點。

所以這一直很好,在那裏我已成功加載三個不同的腳本,但現在,我創建了一個新的類,並添加這樣的腳本:

LuaHandler::i().create("script_file", (void*)(this), function_list); 

因爲LuaHandler是單身,我可以綁定來自該類的構造函數的腳本以進行綁定。我在前一課中做了完全相同的事情,我只是複製它並更改了類的名稱以創建這個新類。

然而,在時機成熟時此腳本被加載,我得到一個Illegal Instruction,GDB沒有跟蹤它非常好,所以我用DrMemory和得到這個輸出:在

http://pastebin.com/QuSqgxvp

所以我使用的運行方法

Tools::LuaScript* script = (Tools::LuaScript*)i->second.second; 

    if(script->req_update()) { //LuaHandler:56 
     ... 
    } 

這會帶回一些無效的指針。我打電話給create(),就像我在每個班級所做的一樣,但由於某種原因,在這種情況下失敗了。

我很抱歉,如果這很難理解,這是棘手的解釋,如果需要的話,我可以發送涉及的2個文件。 ()允許函數run(),render()和req_update()被抽象地調用)綁定到一個lua_State *使用LuaHandler :: i()。create() ,但是當我循環訪問綁定的腳本時,調用其中任何一種方法都會失敗。當它不適用於其他相同的綁定類。

+0

有許多可能的原因,從「在刪除對象後使用」到不太明顯的情況,以及涉及多重繼承的void *與派生類之間的不小心轉換。你最好分享重現問題的最小代碼。 – Vlad

+0

那麼我添加的一個類繼承了兩個類,而另一些則沒有,但是我認爲只要它們都從Tools :: LuaScript繼承,就可以將它們存儲爲void並不重要。 – matthew9090

+0

如果它們都繼承了Tools:LuaScript,然後存儲指向該基地的指針,則不要通過void *進行投射。當你這樣做的時候,關於層次結構中子類位置的信息就會丟失,當你將從void *轉換回派生類時,你會得到錯誤的指針。看例子:http://ideone.com/4vbWS0 – Vlad

回答

0

所以我總是最終回答我自己的問題......新手的錯誤真的,我創建了這樣的類的實例:

A c(mapp, renderer); 

當我應該已經創建了一個指針

A *a = new A(app, renderer); 

因爲我在那裏實例被你摧毀一個函數結束時創建它,因此存儲的指針變爲無效。