luaT_pushudata返回正确的Tensor类型和维度,但垃圾数据

时间:2016-08-25 03:42:51

标签: c++ lua torch

我有一个简短的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之间的交流。

1 个答案:

答案 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,但复制内存方法工作得很好。