2014-04-28 7 views
1

나는 루아가이 오류가 발생하는 longjmp를 사용하는 C의 컴파일러에 의해 준수 할 때 내가 아는이luaL_error가 호출 될 때 왜 C++ 객체 소멸자가 호출되지 않습니까?

class Test 
{ 
public: 
    Test() {printf(">>> Test()\n");} 
    ~Test() {printf(">>> ~Test()\n");} 
} 

int myFunc(lua_State *L) 
{ 
    Test t; 
    luaL_error(L, "error"); 
    return 0; 
} 

과 같은 코드의 조각이있다. 그래서, 나는 C++ 컴파일러를 사용하여 오류를 건네기 위해 C++ 예외를 사용하고 오류가 발생하더라도 소멸자가 호출되도록 컴파일했습니다. 하지만 내 문제는 객체의 소멸자가 호출되지 않는다는 것입니다. 그러나

, 다음과 같은 코드가 작동 (소멸자가 호출된다)

int myFunc(lua_State *L) 
{ 
    Test t; 
    throw(1) // just for testing 
    return 0; 
} 

왜이 앞으로 일어날? LUAI_THROW 매크로는 throw 키워드로 해석됩니다.

+0

이 게시물의 중요 정보가 누락되었습니다. – Schollii

답변

1

근본적인 원인은 Visual C++ 컴파일러의 예외 처리 모드와 관련이 있습니다. 나는 컴파일러가 이름 - 맹 글링을하지 못하도록 extern "C"수정 자와 함께 lua 함수 (예 : luaL_error)를 사용합니다. 그리고 기본 예외 처리 모드는 Extern "C"함수가 예외를 발생시키지 않는다고 가정하는/EHsc입니다. 따라서 예외를 포착 할 수 없습니다. 해결 방법은/EHsc to/EHs입니다.

자세한 내용은 http://msdn.microsoft.com/en-us/library/1deeycx5.aspx을 참조하십시오.

1

함수 luaL_error()는 exit()를 호출하여 프로그램의 전체 실행을 취소합니다! Desctructor는 Test t가있는 범위가 끝나지 않기 때문에 호출되지 않습니다. 오류를 복구하려면 다른 기능을 사용해야합니다.

어떻게 lua에서 오류를 호출합니까? 나는 당신이 lua_cpcall을 사용하여 오류가 발생했을 때이 종료를 arround로가는 보호 된 호출을 할 필요가 있다고 생각한다!

+0

예, myFunc는 lua_pcall에 의해 보호됩니다. 이것은 lua 스크립트 파일에 노출 된 API 함수입니다. 그래서 근본 원인은 위에서 언급 한 것과 다릅니다. – Kery

+0

luaL_error (L, "error")를 둘러 보았습니까? try/catch 블록을 사용합니까? – clambake

+0

당신의 생각을 상기시켜 준 후, try, catch (...) {} 블록에 의해 luaL_error에 의해 던져진 에러가 잡힌다. 예외가 발생하면 "Microsoft C++ 예외 : 메모리 위치 0x003fdc6c의 lua_longjmp .."가 출력됩니다. – Kery