在我的项目中,我编写了以下代码:
Eigen::ArrayXf foo(const Eigen::ArrayXcf &src)
{
auto * output = new float[src.size()];
//Fill the data here
return Eigen::Map<Eigen::ArrayXf>(output, src.size());
}
注意,在return语句中构造的东西是Eigen::Map
,但是编译器没有任何抱怨,因此必须进行转换。因此,我有以下问题:
Eigen::Array
拥有*output
中的数据,而不是复制它,并在销毁时释放该内存块,我该如何实现?在here处,我注意到Eigen::Array
和Eigen::Matrix
可以使用原始数据指针进行初始化,但似乎仅适用于固定大小的数组和矩阵。该函数将经常被调用,所以我很在乎效率。ArrayXf
具有Map<ArrayXf>
(实际上来自任何ArrayBase<...>
对象)的隐式构造函数,该构造函数对内容进行了深层复制。从Eigen的角度来看,您的代码是安全的,但是会泄漏内存,因为您从未取消分配float* output
数据。通常,在编写干净的C ++代码时,应避免new
或至少将其封装。
您可以通过直接分配以后要返回的Array
对象来简化代码(由于RVO(返回值优化),因此在任何非古老的C ++编译器上都不会有副本):] >
Eigen::ArrayXf foo(const Eigen::ArrayXcf &src) { Eigen::ArrayXf output_array(src.size()); float * output = output_array.data(); //Fill the data here return output_array; }
如果要完全避免在函数内部分配内存,则需要详细说明实际应在哪个位置分配内存。您可以只在该位置构造一个
Array
对象,并通过引用将其传递给您的函数(或使其成为具有foo
作为成员函数的类的成员变量)。