Luabind 0.9.1使用STL迭代器只显示一个元素
luabind 0.9.1 uses stl iterator only show one element
我得到了一个奇怪的问题,而使用luabind返回一个stl::vector::迭代器到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中的所有元素,但它只显示第一个元素,然后崩溃了。
非常感谢!:)
杰森我看到两个问题:
你使用指针和new就像在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容器时假定stl容器仍然存在,并且只将迭代器存储在该容器中。
则不能返回容器的副本,因为当您想要使用迭代器时,该容器将不再存在。这就像使用对临时容器的引用。
在这个luabind文档示例中可以看到,使用return_stl_iterator的想法是拥有一个仍然可访问的容器。在本例中,容器存在于一个结构体中。这不是临时的。
您可能会尝试用new分配vector,并在get_car_list函数中返回对该vector的引用。但不要这样做:那你什么时候能解放你的集装箱呢?
如果你想返回一个在其他地方不存在的vector (vector的临时副本),那么你不应该使用return_stl_iterator策略,它似乎不是为此而设计的。
相关文章:
- lower_bound()返回最后一个元素
- 使用std::transform将一个范围的元素添加到另一个范围中
- 我想访问std::unique_ptr中的一个特定元素
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 删除映射和分割错误中的一个过去结束元素
- Lower_bound不适用于具有 3 个元素的向量的最后一个元素
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- 检查 2D 网格的某个元素是否与另一个元素共享对角线、水平线或垂直线
- 如何创建一个所有行大小不同的 2D 数组,并且用户将指定每行将有多少个元素?
- 仅显示链表的最后一个元素
- 为什么在 std::map 上移动无法将元素从一个映射移动到另一个映射
- 查找最小的下一个更大的元素
- push_back通过自行创建的对象获取最后一个元素的向量
- 使用 map.end() 访问 map 的最后一个元素
- 如何知道地图中的最后一个元素是否被删除?
- 选择一个元素而不是一个对象的数组的原因
- std::矢量保存 只推送最后一个元素
- 为什么这个选择排序算法仍然切换一个元素,当它已经是其他元素中最小的元素时?
- 动态分配列表 - 创建一个函数,用于删除所有包含偶数值的元素