2012-04-11 4 views
4

나는 기본적으로 단지 lua 스크립트를 실행하는 C++ 프로그램을 만들고있다. 그 루아 스크립트에서 그러나 클래스는 내 C++ 프로그램에서 루아 스크립트로 내보내졌습니다. 내 주요() C++ 함수를 그냥 준비 후 호출lua - 클래스 소멸자의 늦은 호출

...

luabind::call_function<void>(m_L, "main"); 

지금 내 루아 스크립트 내가 표준을 포함했다

local function test() 
local c = C() 
end 

function main() 
    for i=1,2 do 
     log(i) 
     test() 
    end 
end 

이 :: < < cout을 "처럼 보인다 소멸자 "< < std :: endl; C의 소멸자에서 호출 될 때 알 수 있습니다. 나는 lua의 가비지 콜렉션이 test()가 끝날 때마다 c의 소멸자를 호출 할 것으로 예상한다. 왜냐하면 그것이 범위를 벗어날 때이기 때문이다. 대신에 나는 다음과 같은 출력을 참조하십시오

1 
2 
destructor 
destructor 

오히려

이상을
1 
destructor 
2 
destructor 

사람이 왜 아이디어가 있습니까? 내가 여기서 뭔가를 놓치고 있니? 이 범위를 벗어날 때이기 때문에

답변

8

나는() 종료 루아의 가비지 콜렉션이 테스트의 C 매번 실행의 소멸자를 호출하는 기대.

이것은 그렇지 않습니다. 루아의 가비지 콜렉션은 모든 스코프의 끝에서 실행되지 않습니다. 일반적으로 소멸자가 실행될 때 의존 할 수없는 가비지 수집 언어가 있으며 일부 언어에서는 객체가 전혀 파멸되지 않을 수도 있습니다.

C++처럼 루아가 자동으로 객체를 결정적으로 파괴 할 수있는 방법이 없습니다.

당신이 이것에 의존해야한다면 루아의 collectgarbage 함수를 사용할 수 있습니다.하지만 단순히 기대를 바꾸고 그에 따라 재 설계하는 것이 더 나을 것입니다.

Here's 가비지 수집 방법에 대한 루아 문서.


가 CollectGarbage 사용 예 :

local function test() 
    local c = C() 
end 

function main() 
    for i=1,2 do 
     log(i) 
     test() 
     collectgarbage "collect" 
    end 
end 
+0

흠, 즉 다소 불쾌하다. 이제는이 예제를 명확하게하기 위해 축소했지만 실제 응용 프로그램에서는 C가 거대한 대상 (약 100-1000MB)입니다. 그걸 정리해야 해! 루아에서 기대했던 동작을 얻을 수있는 방법이 있습니까? –

+1

@ chris.schuette : C에서'lua_gc' 또는 루아에서'collectgarbage'가 필요하다면 수동으로 가비지 콜렉터를 호출 할 수 있습니다. – sbk

+0

여러분, 고마워요! –

관련 문제