luabind 0.9.1仅使用STL迭代器显示一个元素。
2011-9-13 4:35:26
收藏:0
阅读:96
评论:1
我在使用luabind将stl::vector::iterator返回给lua脚本时遇到了奇怪的问题。
以下是代码:
1)我创建了两个函数,它们由lua脚本调用:
std::vector<car*> get_car_list()
{
std::vector<car*>* vec = new std::vector<car*>();
vec->push_back(new car("I'm the 1st"));
vec->push_back(new car("I'm the 2nd"));
return *vec;
}
void output(const std::string& msg)
{
std::cout << "lua:" << msg << std::endl;
}
2)我将函数绑定到lua
luabind::module(L)
[
luabind::def("get_car_list", &get_car_list, luabind::return_stl_iterator)
];
luabind::module(L)
[
luabind::def("output", &output)
];
3)我按以下方式执行脚本:
function test()
items = get_car_list();
for item in items do
output(item:get_name());
end
end
4)结果是: 在输出窗口中,只显示:
lua:I'm the 1st
程序在luabind/policy.hpp:754中中断
template <>
struct default_converter<std::string>
: native_converter_base<std::string>
{
.....
void to(lua_State* L, std::string const& value)
{
lua_pushlstring(L, value.data(), value.size()); // !!Break Here with Error EXC_BAD_ACCESS
}
};
我想显示std::vector中的所有元素,但它只显示第一个并崩溃了。
非常感谢你! :)
Jason
原文链接 https://stackoverflow.com/questions/7396856
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
我看到两个问题:
您使用指针和 new,好像我们在使用 Java,但实际上这是 C ++。如果按照这种方式使用 C ++,您将遇到明显的内存泄漏问题。
除非您有特殊的原因,否则应该这样做:
std::vector<car> get_car_list() { std::vector<car> vec; vec.push_back( car("我是第一辆车")); vec.push_back( car("我是第二辆车")); return vec; }
但您的代码还存在第二个问题:
显然, return_stl_iterator 假设在使用它时 STL 容器仍然存在,并且仅存储到该容器的迭代器。
因此,您不能像这样返回容器的拷贝,因为在您想要使用迭代器时该容器将不存在。这就像在使用临时容器的引用一样。
如 luabind doc 中所示的示例,return_stl_iterator 的想法是拥有一个仍然可访问的容器。在该示例中,容器存在于结构中。这不是临时的。
您可能会想通过 new 来分配向量,并在 get_car_list 函数中返回对此向量的引用。但不要这样做:您什么时候释放容器呢?
如果您想返回一个不存在于其他地方的向量(向量的临时拷贝),则不应使用 return_stl_iterator 策略,因为它似乎并不是为此而设计的。