luabind 0.9.1使用stl迭代器只显示一个元素

时间:2011-09-13 04:35:26

标签: c++ iterator luabind

使用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中的所有元素,但它只显示第一个元素并崩溃。

非常感谢你! :)

杰森

1 个答案:

答案 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策略,似乎没有这个。