使用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中的所有元素,但它只显示第一个元素并崩溃。
非常感谢你! :)
杰森
答案 0 :(得分:3)
我看到两个问题:
你使用指针和新的,如果我们是Java,但它是C ++。如果以这种方式使用C ++,您将有明显的内存泄漏。
除非您有特殊原因,否则应该是:
std::vector<car> get_car_list() {
std::vector<car> vec;
vec->push_back( car("I'm the 1st"));
vec->push_back( car("I'm the 2nd"));
return vec; }
但是用你的代码输入第二个问题:
我似乎return_stl_iterator假设stl容器在你使用时仍然存在,并且只将迭代器存储到这个容器中。
然后,您无法以您的方式返回容器的副本,因为当您想要使用迭代器时,容器将不再存在。就像你正在使用对临时容器的引用一样。
如本例luabind doc所示,return_stl_iterator的想法是拥有一个仍可访问的容器。在该示例中,容器存在于结构中。这不是暂时的。
您可能想要使用new分配向量,并在get_car_list函数中返回对此向量的引用。但是不要这样做:那么你什么时候可以释放你的容器呢?
如果你想返回一个其他地方不存在的向量(向量的临时副本),那么你不应该使用return_stl_iterator策略,似乎没有这个。