다음과 같은 루아 함수가 있다고 가정합니다.
function my_lua_function(obj) -- C++ 객체상의 메소드를 호출합니다. obj:test_method() end
다음은 C++ 소스입니다.
struct A
{
A() { std::cout << "A()\n"; }
~A() { std::cout << "~A()\n"; }
void test_method() const { std::cout << "test\n"; }
};
int main()
{
using namespace luabind;
lua_State* L = lua_open();
luabind::open(L);
module(L)
[
class_<A>("A")
.def(constructor<>())
.def("test_method", &A::test_method)
];
// 함수를 정의하기위한 루아코드를 생성하는 등등의 작업을 진행합니다.
// 루아 state가 아직 존재하더라도 객체(object)와 functor가 소멸해야하기 때문에
// 블럭으로 묶어주었습니다.
{
// 루아 함수를 참조하기위해 my_lua_function object를 초기화합니다.
object fun = get_globals(L)["my_lua_function"];
luabind::functor<void> my_lua_function = object_cast<functor<void> >(fun);
// adopt(_1)은 포인터의 소유권이 루아로 이전될 것이라는 것을 의미합니다.
// 좀더 구체적으로 말하자면 포인터가 개비지 컬랙트당하면 메모리 해제됩니다. (이부분이 핵심!)
my_lua_function(new A())[adopt(_1)];
}
lua_close(L);
return 0;
}
간단히 말하면 adopt() 정책을 사용하면 된다는 의미.









![[http]](/wiki/imgs/http.png)
