使用longjmp的C++和C库

use*_*427 5 c++ lua longjmp

我正在使用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());
Run Code Online (Sandbox Code Playgroud)

我的理解是longjmp不会展开堆栈,所以我的stringstream对象不会被破坏.如果我没记错的话,stringstream其他C++库类通常会在堆上分配数据,当对象被销毁时会释放这些数据.但是,析构函数不会在这里调用,所以我认为这会导致内存泄漏.根据编写脚本的人,我可能会引发很多错误,从而泄漏大量内存.

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

Jur*_*aho 8

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

  • 如果堆栈已展开,是否还会释放错误消息的内存,从而导致内存访问无效? (2认同)