Luabind 0.9.1使用STL迭代器只显示一个元素

luabind 0.9.1 uses stl iterator only show one element

本文关键字:元素 一个 显示 使用 迭代器 STL Luabind      更新时间:2023-10-16

我得到了一个奇怪的问题,而使用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策略,它似乎不是为此而设计的。