2011-09-13 11 views
1

luabindを使ってluaスクリプトにstl :: vector :: iteratorを返す際に奇妙な問題が発生しました。以下はluabind 0.9.1はstl iteratorを使います。一つの要素しか表示しません。

コードです:

1)私は、彼らはLuaのスクリプトによって呼び出される2つの関数を作成:

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)私は

luabind::module(L) 
[ 
    luabind::def("get_car_list", &get_car_list, luabind::return_stl_iterator) 
]; 

luabind::module(L) 
[ 
    luabind::def("output", &output) 
]; 

をLUAする機能をバインド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

私は2つの問題を参照してください。

我々は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; } 

しかし、あなたのコードの第2の問題に入り:あなたは、特定の理由がある場合は、それがあるべき除き

を私はreturn_stl_iteratorはあなたがそれを使用するときにSTLコンテナがまだ存在することを前提としているようですイテレータはこのコンテナにのみ格納されます。

イテレータを使用するときにコンテナが存在しなくなるため、コンテナのコピーを返すことはできません。一時的なコンテナへの参照を使用している場合と同じです。

この例では、luabind docのように、return_stl_iteratorのアイデアは、まだアクセス可能なコンテナを持つことです。この例では、コンテナは構造体に存在します。一時的ではありません。

vectorをnewで割り付け、get_car_list関数でこのベクトルへの参照を返したい場合があります。しかし、これをしないでください:いつあなたはあなたのコンテナを解放しますか?

他のどこにも存在しないベクトル(ベクトルの一時コピー)を返す場合は、return_stl_iteratorポリシーを使用しないでください。

+0

ありがとうございます!私のプロジェクトでは、ベクトルを構造体に格納します。それはルアビンドをテストするための簡単なサンプルを作成するので、とても悪く見えます:P –

関連する問題