Нужна помощь в понимании того, как luabind создает экземпляры классов - PullRequest
5 голосов
/ 15 августа 2011

Допустим, у меня есть такой класс:

class A
{
public:
A(){}
~A(){}
};

И выставить это Луа через Луабинда так:

module(luaState) 
    [
        class_<A>("Foo")
        .def(constructor<>())
    ];

И, наконец, создать его в таком скрипте:

A = Foo();

Каково фактическое «состояние существования» А в этой точке?

Это где-то в куче, а Луа где-то ссылается на это? (или luabind :: object?)

У меня такое ощущение, что это может быть только указатель, например, выделенный новым или эквивалентным.

Тем не менее, я могу связать функции с lua, которые принимают ссылки, например lua_doSomething(A & a), и то, что заканчивается, будет реальной ссылкой. Конечно, я знаю, что это может быть просто luabind, передающий a как *a, но я понятия не имею, так ли это происходит.

Причина, по которой я спрашиваю это, состоит в том, чтобы понять и предсказать время жизни объектов, созданных в сценарии, чуть лучше.

Это, и я не уверен, изменятся ли владельцы или время жизни, если вместо того, чтобы выставлять класс lua, как описано выше, я делаю это так:

A * lua_CreateA()
{
return new A();
}

module(luaState) 
    [
        class_<A>("Foo")
    ];


module(luaState)
    [

    def("createA",&lua_CreateA)

    ];

И используя его как

A = createA();

В соответствии с логикой, которую я понимаю до сих пор, этот случай потребовал бы от меня выполнения очистки, поскольку я один выделяю новый объект, если только такое присваивание для luabind не будет таким же, как выполнение с связанным конструктором.

Короче говоря, я действительно очень озадачен временем жизни объектов и тому подобным ... Я гуглил по ключевым словам, связанным с этим, но я получаю только такие вещи, как http://www.gamedev.net/topic/525692-luabind-ownership-and-destruction/

Что на самом деле не то, что я хочу знать. Я хочу понять конкретный способ, как вещи обрабатываются за кулисами относительно распределения, создания экземпляров, времени жизни и всего такого.

1 Ответ

5 голосов
/ 15 августа 2011

Срок службы объекта очень прост с Luabind. Вам не нужно разбираться в мрачных деталях того, что делает Luabind внутри, чтобы получить это.

Lua владеет объектами, которые созданы Lua напрямую. Поэтому, если вы выделите объект с синтаксисом конструктора в Lua, этот объект будет принадлежать Lua. Когда на объект больше не ссылаются в Lua, GC Lua его заберет.

Если Lua получает ссылку на объект любым другим способом, то Lua не владеет этим объектом, если только вы не передадите правообладание с использованием политики принятия Luabind. Поэтому, если вы связываете функцию, которая возвращает объект Lua, так что теперь вы ожидаете, что Lua решит, будет ли этот объект живым или нет, вам нужно будет использовать политику принятия.

Последний абзац применяется только к реальным ссылкам (возвращающие указатели и ссылочные типы). Если Lua будет предоставлена ​​ копия объекта (через возвращаемое значение без ссылки или указателя), то Lua будет владеть этой копией объекта.

...