1
We have a problem in our project,we use lua 5.1 as our scripting language.

しかし、lua_pushnumber を使用して 1 つの関数で C++ から lua にあまりにも多くのデータを渡すと、lua スタックがスタック オーバーフローのように見え、C++ のメモリの他の部分が書き込まれ、コールバックが C++ に戻るときにシステムがクラッシュします。lua スタック サイズのサイズを制御するパラメータがあるかどうかを知りたいです。lua.h に定義されているパラメータ LUA_MINSTACK を変更しようとしましたが、うまくいかないようです。また、lua_checkstack() を使用して、lua スタックにあまりにも多くの数をプッシュしないようにしていますが、これも機能しません。

getNineScreenEntity(lua_State* L)
{
    DWORD screenid = GET_LUA_VALUE(DWORD,1)
    struct EntryCallback : public ScreenEntityCallBack
    {
        EntryCallback(){ }
        bool exec(ScreenEntity * entity)
        {
            list.push_back(entity)
            return true;
        }
        std::vector<ScreenEntity*> list;
    };
    EntryCallback exec;
    Screen* screen = ScreenManager::getScreenByID(screenid);
    if (!screen)
        return 0;
    screen->execAllOfScreenEntity(exec);
    int size = 0;
    std::vector<ScreenEntity*>::iterator vit = exec.list.begin();
    for (; vit != exec.list.end(); ++vit)
    {
        lua_pushnumber(L,(*vit)->id);
        ++size;    
    }
    return size;
} 

1 つの画面にエンティティが多すぎると、プログラムがクラッシュするようです。

4

2 に答える 2

3

たぶんこれが役立つでしょう(Lua 5.2マニュアルから)

int lua_checkstack (lua_State *L, int extra);

「スタックに少なくとも「余分な」空きスタック スロットがあることを確認します。要求を満たすことができない場合は false を返します。これは、スタックが固定された最大サイズ (通常は少なくとも数千の要素) よりも大きくなるためです。または、新しいスタック サイズにメモリを割り当てることができないためです。この関数はスタックを縮小しません。スタックが既に新しいサイズよりも大きい場合は、変更されません。」

これはc関数の例です...

static int l_test1 (lua_State *L) {
    int i;
    printf("test1: on the way in"); stackDump(L);
    int cnt = lua_tointeger(L, 1);
    printf("push %d items onto stack\n", cnt);
    printf("try to grow stack: %d\n", lua_checkstack(L, cnt));
    for (i=0; i<cnt; i++) {
        lua_pushinteger(L, i);                      /* loop -- push integer */          
    }
    printf("test1: on the way out"); stackDump(L);
    return 1;
}

このコード:

  • 関数に入る途中でスタックをダンプします。(1)
  • 'cnt' 個の空きスロットを持つようにスタック サイズを拡張しようとします (これは true (機能した場合)、または false (機能しなかった場合) を返します)。
  • スタックに「cnt」個の整数をプッシュします
  • 途中でスタックをダンプします。

$ lua demo.lua 
running stack test with 10 pushes
test1: on the way in
---1--
[1] 10
-----
push 10 items onto stack
test1: on the way out
---11--
[11] 9
[10] 8
[9] 7
[8] 6
[7] 5
[6] 4
[5] 3
[4] 2
[3] 1
[2] 0
[1] 10
-----
running stack test with 1000 pushes
test1: on the way in
---1--
[1] 1000
-----
push 1000 items onto stack
try to grow stack: 1
test1: on the way out
---1001--
[1001] 999
[1000] 998
[999] 997
[998] 996
[997] 995
[996] 994
...

上記のコードに lua_checkstack() 呼び出しがない場合、1000 個のアイテムをスタックにプッシュしようとするとエラーが発生します。


running stack test with 1000 pushes
test1: on the way in
---1--
[1] 1000
-----
push 1000 items onto stack
Segmentation fault (core dumped) 
$

(1) stackDump() は、PiL 3rd ed に登場するものと似ています。スタックの内容をダンプするため。

于 2013-04-04T01:50:52.370 に答える
0

プッシュする前に毎回Luaスタックをチェックする必要があります。
スタック サイズはデフォルトで 20 です。より多くのスペースが必要な場合は、手動で拡大する必要があります。
Lua マニュアル

于 2013-04-03T15:46:26.290 に答える