C++ 和 C 库使用 longjmp
C++ and C library using 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());
据我了解,longjmp 不会展开堆栈,因此我的stringstream
对象不会被破坏。如果我没记错的话,stringstream
和其他C++库类通常会在堆上分配数据,当对象被销毁时,这些数据会被释放。但是,这里不会调用析构函数,所以我认为这会导致内存泄漏。根据编写脚本的人,我可能会引发很多错误,从而泄漏大量内存。
我相信其他人需要解决与此类似的问题,但我找不到任何我所追求的东西。很多地方都说对象不会被破坏,但我认为一定有一种方法可以确保释放内存?
解决方案是将Lua编译为C++库。然后luaL_error()
将抛出异常而不是调用longjmp()
并且所有内容都将被堆栈展开破坏。
相关文章:
- [longjmp/setjmp]c++ 相同的代码窗口有异常 Linux 没有错误并且运行良好
- 为什么 setjmp/longjmp 的这种用法是未定义的行为?
- longjmp应该还原堆栈吗
- setjmp/longjmp 在发布和调试中的不同行为
- 运行时特性测试、setjmp、longjmp和信号掩码
- C++ 和 C 库使用 longjmp
- 不一致的警告:变量可能会被“longjmp”或“vfork”破坏
- 通过尝试块进行 longjmp 是否安全
- 当使用setjmp和longjmp时,Valgrind会失败
- 在Arduino IDE中使用正则表达式库时对"longjmp"的未定义引用
- 在C中链接到c++库时使用setjmp和longjmp
- c++异常和setjmp/longjmp的代价
- 在C++中使用set_jmp/longjmp不起作用