[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Lua and C++ memory
- From: Matt Campbell <mattcampbell@...>
- Date: Tue, 20 Nov 2007 19:41:31 -0600
Memory for userdata is allocated and freed by Lua. There's nothing
special about userdata in tables, at least from the perspective of the
Lua C API. Lua has no knowledge of C++ constructors and destructors,
but it does support __gc metamethods in the metatables of userdata. So
to wrap an instance of a class called Foo in Lua userdata, you'd write
code like this:
Foo **pp = (Foo *) lua_newuserdata(L, sizeof(Foo *));
*pp = new Foo;
Then you'd set the new userdata's metatable to a table with a __gc
metamethod like this:
static int foo_gc(lua_State *L) {
Foo **pp = (Foo **) lua_touserdata(L, 1);
if (*pp) {
delete *pp;
*pp = NULL;
}
return 0;
}
Actually, to be foolproof, any C functions which take userdata as
arguments, including __gc metamethods, should check for the correct
metatable. But that's beside the point here.
Your C++ code need not be concerned about how many references to the
userdata are passed around within Lua. Just implement a __gc metamethod
as shown above, and Lua will take care of the rest.
Matt