2011-01-16 5 views
0

Ich habe Probleme mit Luabind. Ich definiere eine std :: map, um in lua erstellte Objekte zuzuweisen. Ich veröffentliche diese Karte als globales Objekt in lua auf diese Weise:Wann luabind frei erstellte Objekte?

luabind::globals(L)["g_SceneManager2D"] = this; 

Danach wird diese Aufgabe in eine Funktion in Lua verwendet, wo viele Objekte erstellt werden und in diese Karte eingefügt. Das Problem tritt auf, wenn die lua-Funktion endet und luabind das Steuerelement an das C++ - Programm zurückgibt, da automatisch alle Inhalte der Map verloren gehen.

Ich war auf der Suche nach dem Fehler. Ich halte den Lua-Kontext am Leben, also muss dieses Objekt existieren.

Könnten Sie mir helfen?

Vielen Dank :)

+0

Wenn Sie mehr Code schreiben, erhalten Sie wahrscheinlich bessere Antworten: welcher Typ ist 'this' und die Funktionsdeklarationen der exportierten Methoden, auch der Lua-Code, der diese Funktionen aufruft. – sbk

Antwort

1

Ich schlage vor, eine shared_ptr<>(this) verwenden, anstatt roh this. boost::shared_from_this könnte helfen. Stellen Sie sicher, dass Ihre Klasse auch mit Luabind registriert ist und dass class_ als von einer shared_ptr gehalten festgelegt ist.

Eine weitere lustige Idee könnte sein, Ihre Lua-Funktion einfach die "Map" als Lua-Tabelle zu erzeugen, sie zurückzugeben, und Sie können darüber in C++ iterieren, um Ihre std::map zu erstellen.

1

Wenn ich Ihr Problem richtig verstehe, scheint es, Sie erstellen Objekte in Lua, die Sie dann in die Karte einfügen (entweder durch Lua oder C++) und anschließend verlieren. Ohne etwas mehr Code ist es schwer zu sagen, was genau das Problem ist. Allerdings würde ich zuerst darauf achten, dass diese Objekte tatsächlich erstellt werden (überprüfen Sie es) und dann würde ich überprüfen, ob Lua nicht Müll ist, der sie sammelt. Wenn Lua wirklich Müll sammelt, dann werden Sie sie auf der C++ Seite nicht sehen, weil sie, naja, weg sind.

Wenn es hilft, beende ich ein Projekt, das etwas ähnliches tut. Ich musste C++ - Objekte von Lua erstellen und abrufen, aber anstatt die Objekte in Lua zu erstellen, rief ich einfach C++ - Funktionen an, um es für mich zu tun und benötigte Daten im Lua-Aufruf (gebunden an Luabind) zu senden. Diese (C++) Funktionen indizierten die Objekte nach IDs in Hashtabellen, und die IDs wurden an Lua zurückgegeben, falls das Objekt script-seitig für Operationen abgerufen werden musste. Dieses Setup macht es einfacher (und sicherer), Speicherdaten korrekt zu behandeln und verhindert, dass Lua keine Objekte sammelt.