gpt4 book ai didi

使用 longjmp 的 C++ 和 C 库

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:21:03 28 4
gpt4 key购买 nike

我正在使用 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 的 C++ 和 C 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13560945/

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