特征映射 - 它是否拥有数据指针的所有权?

时间:2014-02-01 09:49:09

标签: c++ eigen

我正在使用Map类创建一个矩阵:

float* d = new float[rows*cols];
// ... getting data into d
Eigen::Map<Eigen::MatrixXf>(d, rows, cols);         

我的问题是 - Map取得数据指针的所有权并在完成后删除它吗?或者它是否复制数据,我应该在创建地图后自己释放它吗?

感谢。

2 个答案:

答案 0 :(得分:5)

不,Map不取得所有权,因此您仍有责任释放内存。实际上,由于以下几个原因,相反的情况是不可能的:

  • Map无法知道内存的分配方式
  • 您只能映射已分配缓冲区的子范围

此外,以下内容会非常奇怪:

 float *d = new float[10];
 // ...
 VectorXf v = ...;
 v = v + Map<VectorXf>(d,10);
 // now d is a dead pointer

没办法!

答案 1 :(得分:0)

文档在这方面非常稀少,但除此之外删除您尚未创建的内容更为常见,this one之类的帖子建议您应该删除 d,当你准备好了。

我建议运行一个像valgrind这样的内存分析器,它会告诉你如果没有删除指针。

如果您不删除d valgrind个报告:

400 bytes in 1 blocks are definitely lost in loss record 1 of 1
  in operator new[](unsigned long) in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so
  1: operator new[](unsigned long) in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so
  2: main in test

所以你可以确定你必须删除你的数据(这很好)。

对该文件感到遗憾......