我有一个简短的C ++代码片段理论上应该可以创建并返回一个torch.IntTensor对象,但是当我从Torch调用它时,我得到了垃圾数据。
这是我的代码(请注意,此代码片段不会记录函数注册,但只需说它注册正常 - 我可以在必要时提供它):
static int ltest(lua_State* L)
{
std::vector<int> matches;
for (int i = 0; i < 10; i++)
{
matches.push_back(i);
}
performMatching(dist, matches, ratio_threshold);
THIntStorage* storage = THIntStorage_newWithData(&matches[0], matches.size());
THIntTensor* tensorMatches = THIntTensor_newWithStorage1d(storage, 0, matches.size(), 1);
// Push result to Lua stack
luaT_pushudata(L, (void*)tensorMatches, "torch.IntTensor");
return 1;
}
当我从Lua打电话给我时,我应该得到一个[torch.IntTensor of size 10]
而且我会这样做。但是,数据似乎是内存地址或垃圾:
29677072
0
16712197
3
0
0
29677328
0
4387616
0
[torch.IntTensor of size 10]
应该是数字[0,9]。
我哪里错了?
为了记录,当我在C ++中测试时
for (int i = 0; i < storage->size; i++)
std::cout << *(storage->data+i) << std::endl;
打印正确的值。
同样
for (int i = 0; i < tensorMatches->storage->size; i++)
std::cout << *(tensorMatches->storage->data+i) << std::endl;
所以我觉得问题在于C ++和Lua之间的交流。
答案 0 :(得分:0)
所以我在其他地方得到了答案 - the Google group for Torch7 - 但我会在这里复制并粘贴给任何可能需要它的人。
来自用户@alban desmaison:
您的问题实际上是内存管理。
当您的C ++函数返回时,您
vector<int>
是免费的,其内容也是如此。 从那时起,张量指向可用内存,当您访问它时,您可以访问释放的内存。 你必须要么:
- 使用
malloc
(作为int
s的数组)在堆上分配内存,并使用当前的THIntStorage_newWithData(当您执行newWithData时,指针将被free
编辑它不再被Torch使用了。- 以您当前的方式使用
vector<int>
,但使用THIntTensor_newWithSize1d(matches.size())创建一个具有给定大小的新Tensor,然后将该向量的内容复制到张量中。
为了记录,我无法使用malloc
,但复制内存方法工作得很好。