gpt4 book ai didi

c++ - luabind 0.9.1 使用 STL 迭代器只显示一个元素

转载 作者:行者123 更新时间:2023-11-30 03:05:51 25 4
gpt4 key购买 nike

我在使用 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) 我将函数绑定(bind)到 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容器在你使用的时候还存在,只把迭代器存到这个容器里。

然后您不能像您那样返回容器的拷贝,因为当您想要使用迭代器时容器将不再存在。这就像您正在使用对临时容器的引用。

如本例所示 luabind doc return_STL_iterator 的想法是拥有一个仍然可以访问的容器。在示例中,容器存在于结构中。这不是临时的。

您可能想用 new 分配 vector 并在 get_car_list 函数中返回对该 vector 的引用。但是不要这样做:那你什么时候释放你的容器?

如果你想返回一个在别处不存在的 vector ( vector 的临时拷贝),那么你不应该使用 return_STL_iterator 策略,它似乎不是为此而设计的。

关于c++ - luabind 0.9.1 使用 STL 迭代器只显示一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7396856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com