2009-12-17 3 views
3

개체에 문제가있어 더 이상 필요 없지만 여전히 참조가 있습니다. 결과 : 할당 된 메모리의 크기는 수집 된 개체로 인해 지속적으로 증가합니다.루아에서 잃어버린 참조

어떻게 이런 종류의 문제를 해결할 수 있습니까? 하나의 참조 만있는 객체를 찾거나 특정 값보다 수명이 긴 객체를 찾는 방법이 있습니까? 또는 다른 해결책?

루아 바인드와 함께 루아 5.1 및 C++ 사용.

감사합니다.

+1

luabind :: object 인스턴스를 유지하거나 누출 할 가능성이 있습니까? – sbk

+0

아마도 지키고 있습니다. 모든 luabind :: object 인스턴스가 스택으로 생성되고 C++ 코드에서 그러한 누출이 없으므로 누출되지 않습니다. – kFk

답변

1

C++과 통합하는 것에 대해서는 확실하지 않지만 가비지 수집기에 실행할 기회가없는 것처럼 들립니다.

루아에서 명시 적으로 호출하여 도움이되는지 확인할 수 있습니다. 핵심 API에 기능이 있습니다 collectgarbage(opt [, arg]).

+0

가비지 수집은 주기적으로 실행되며 잘 수행됩니다. 그러나 기존 참조가있는 객체는 수집하지 않습니다. 그러한 대상이 많이 있으며 찾을 수 없습니다. – kFk

+0

순환 참조 문제로 고통 받고 있습니까? –

+0

루아는 순환 참조를 올바르게 해결합니까? 그렇지 않다면 이유가있을 수 있습니다. – kFk

5

누군가가 여기서 언급 했으므로 weak tables을 사용해보세요.

이 같은 일부 코드가있는 경우 : anObject 정지를 사용하면 myListOfObjects 여전히를 참조하기 때문에

myListOfObjects = {} 
... 
table.insert(myListOfObject, anObject) 

다음에, 할당이 해제되지 않을 것이다.

당신은 myListOfObjects에서 참조 (전무에 대한 참조를 설정)을 제거 할 시도 할 수 있지만 간단한 해결책이 약한 테이블으로 myListOfObjects를 선언한다 :

myListOfObjects = {} 
setmetatable(myListOfObjects, { __mode = 'v' }) --myListOfObjects is now weak 

setmetatable 점을 감안 테이블에 대한 참조를 반환 그것을 수정하면 이전 두 줄과 동일한이 더 짧은 관용구를 사용할 수 있습니다.

myListOfObjects = setmetatable({}, {__mode = 'v' }) --creation of a weak table 
+0

약한 테이블은 좋은 메커니즘이지만 약한 테이블에서 사용할 적절한 개체를 찾는 방법은 무엇입니까? 프로젝트에 약 2MB의 루아 코드가 있으며, 어떤 객체가 할당 해제되지 않았고 여전히 참조가 있는지를 찾는 것은 문제가 있습니다. 모든 테이블을 약한 테이블로 변환하면 개체가 조기에 파괴됩니다. 또한 테이블은 주로 개체의 소유권을 가져와 필요할 때만 해제하는 데 사용됩니다. 문제는 모든 참조가 공개되지 않고 찾을 수 없다는 것입니다. – kFk

+0

약한 테이블이 무엇인지 잘 모르겠다면 유일한 방법은 유용하지 않게 될 때 모든 참조를 nil로 설정하는 것입니다. 모든 "클래스"(테이블 유형)에 대해 "소멸자"메소드를 구현하는 것이 좋습니다.이 소멸자 메서드는 더 이상 필요하지 않은 객체에서 호출되어야하며 nil에 대한 참조와 같아야합니다. 또한 "객체 목록"에 대해 참조에 nil을 할당하는 "해방"메소드를 구현하십시오. – kikito