EIGEN地图 - 它是否占数据指针的所有权

Eigen Map - does it take ownership of the data pointer?

本文关键字:数据 指针 所有权 是否 地图 EIGEN      更新时间:2023-10-16

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

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

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

谢谢。

不,Map不占有所有权,因此您仍然负责释放内存。实际上,由于几个原因,相反是不可能的:

  • Map不知道如何分配内存
  • 您只能映射分配的缓冲区的子范围

此外,以下非常奇怪:

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

没办法!

文档对此非常稀少,但是除此之外,它更常见 删除您未创建的内容,诸如此类的帖子建议您应该应该准备就绪时删除 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

因此,您可以确保您必须删除数据(很好)。

对该文档感到羞耻...