5

我正在使用 Lua,它有一个 C API,它的错误引发函数使用 longjmps。当引发错误时,我首先构建一条消息来描述发生了什么问题,然后告诉 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++ 库类通常会在堆上分配数据,当对象被销毁时会释放这些数据。但是,这里不会调用析构函数,所以我认为这会导致内存泄漏。根据编写脚本的人,我可能会引发很多错误,从而泄漏大量内存。

我确信其他人需要解决与此类似的问题,但我找不到任何我所追求的东西。很多地方说对象不会被破坏,但我认为必须有一种方法来确保内存被释放?

4

1 回答 1

8

解决方案是将 Lua 编译为 C++ 库。然后luaL_error()将抛出异常而不是调用longjmp(),并且所有内容都将被堆栈展开销毁。

于 2012-11-26T08:19:23.317 回答