使用 longjmp 的 C++ 和 C 库

我正在使用Lua,它具有一个C API,其错误引发函数使用longjmp。在引发错误之前,我首先构建描述出错原因的消息,然后告诉Lua引发错误。例如:

std :: stringstream ss;
ss << "'" << function->cb->name << "' expects at most " << maxargs_all
<< ' argument(s)and received " << nargs;
luaL_error(L,ss.str()。c_str());

我理解longjmp不会解除堆栈,因此我的stringstream对象不会被销毁。如果我记得正确,stringstream和其他C++库类通常在堆上分配数据,当对象被销毁时,该数据被释放。但是,在这里不会调用析构函数,因此我认为这将导致内存泄漏。根据编写脚本的人,我可能会引发很多错误,因此泄漏很多内存。

我相信其他人也需要解决类似的问题,但是我找不到与我所需完全相同的东西。很多地方说对象不会被销毁,但我认为必须有一种方法来确保内存被释放?

点赞
用户426288
用户426288

解决方案是将Lua编译为C++库。然后,luaL_error()将抛出异常,而不是调用longjmp(),并且一切都将被堆栈展开破坏。

2012-11-26 08:19:23