>> Test()\n");} ~Test() {printf(">>> ~Test()-6ren">
gpt4 book ai didi

c++ - 为什么在调用 luaL_error 时不调用 c++ 对象析构函数?

转载 作者:行者123 更新时间:2023-11-30 04:05:20 27 4
gpt4 key购买 nike

我有一段这样的代码

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

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

我知道当 lua 被 c 编译器编译时,它使用 longjmp 来引发错误。因此,我使用 c++ 编译器编译它,以便它使用 c++ 异常处理错误,即使抛出错误也应该调用析构函数。但我的问题是对象的析构函数没有被调用。

但是,下面的代码是有效的(调用了析构函数)

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

为什么会这样?我确定 LUAI_THROW 宏被解释为 throw 关键字。

最佳答案

函数 luaL_error() 将调用 exit() 来取消整个程序的执行!然后不调用析构函数,因为 Test t 所在的范围没有结束。你应该使用不同的功能来从错误中恢复。

你如何从 lua 中调用错误?我认为您需要使用 lua_cpcall 进行 protected 调用以绕过此错误退出功能!

关于c++ - 为什么在调用 luaL_error 时不调用 c++ 对象析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23336932/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com