2011-09-13 86 views
1

我在使用luabind將stl :: vector :: iterator返回到lua腳本時遇到了一個奇怪的問題。luabind 0.9.1使用stl迭代器只顯示一個元素

下面是代碼:

1)I創建了兩個功能它們通過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)I結合的功能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

與這個問題無關:你的'get_car_list'函數泄漏內存,它在堆上分配一個向量,並通過值返回它。函數返回後,指向堆中向量的指針將丟失。 – Begemoth

回答

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策略,它似乎不是爲此而做的。

+0

非常感謝!在我的項目中,它將矢量存儲在結構中。它創建了一個簡單的樣本來測試luabind,所以它看起來很糟糕:P –