배경 나는 게임 Bitfighter에 Watusimoto 작업루아, C++ 및 사라지고 메타 테이블
. 우리는 LuaWrapper 변형을 사용하여 우리의 C++ 객체를 게임의 루아 객체와 연결합니다. 우리는 또한 벡터 작업을 가속화하기 위해 lua-vec이라는 Lua 변형을 사용합니다.
우리는 우리를 벗어난 버그를 해결하기 위해 노력해 왔습니다. 손상된 메타 테이블을 제안하는 임의의 충돌이 발생합니다. 문제에 대한 Watusimoto의 게시물은 here을 참조하십시오. 나는 부패한 메타 테이블 때문에 이것이 맞는지 확신 할 수 없으며, 내가 여기서 물어보고 싶은 아주 이상한 행동을 보았다.
예를 들어 문제점 현시
, 우리는 객체를 생성하고이 같은 수준에 추가 :
t = TextItem.new()
t:setText("hello")
levelgen:addItem(t)
그러나, 게임 것이다 때때로 (항상) 충돌. 오류로 : 위에서 언급 한 Watusimoto의 게시물에 대한 응답으로 주어진 제안을 사용
attempt to call missing or unknown method 'addItem' (a nil value)
, 나는에 마지막 줄을 변경 한 다음
local ok, res = pcall(function() levelgen:addItem(t) end)
if not ok then
local s = "Invalid levelgen value: "..tostring(levelgen).." "..type(levelgen).."\n"
for k, v in pairs(getmetatable(levelgen)) do
s = s.."meta "..tostring(k).." "..tostring(v).."\n"
end
error(res..s)
end
때 어떤 경우는 levelgen
의 메타 테이블을 출력 그것으로부터 메소드를 호출하는 것은 잘못되었습니다.
, 그것이 실패하고 메타 테이블을 출력 할 때이, 미친, 메타 테이블은 (정확한 addItem
통화와 모든 것을) 어떻게해야 정확히입니다. 스크립트가로드 될 때 levelgen
에 대한 메타 테이블을 인쇄하고 위의 pcall
을 사용하여 실패하면 모두 동일하며 모든 호출과 userdata에 대한 포인터가 같아야합니다.
마치 levelgen
에 대한 메타 테이블이 무작위로 자발적으로 사라지는 것처럼 보입니다.
아무도 어떤 일이 벌어지고 있는지 알 수 있습니까?
당신에게참고 감사합니다이 만 levelgen
개체 발생하지 않습니다. 예를 들어, 위에서 언급 한 TestItem
개체에서도 발생했습니다. 사실, 같은 코드 같은 오류 메시지가 missing or unknown method 'setText' (a nil value)
Valgrind에서 코드를 실행 해 보셨습니까? C++에서 메모리 손상 문제가있을 수 있습니다. – nneonneo
안녕하세요, 예, 우리는 valgrind를 통해 여러 번 실행했습니다. 거기에 있던 메모리 버그를 수정 한 후에도 문제는 여전히 지속됩니다. – raptor
매우 궁금합니다. 문제를 간단한 테스트 케이스로 줄일 수 있습니까? – nneonneo