Eigen矩阵什么时候释放堆内存?
When does Eigen matrix release heap memory?
我想写一个非常非常小的 matrix/tensor 库,功能最少,API 像 Eigen。
让我困惑的是,设置调试断点,并没有带我进入一些析构函数,我什么也没得到。
要重现,请使用此使用 Eigen 的代码段:
#include <Eigen/Dense>
#include <stdio.h>
#include <iostream>
using namespace Eigen;
int main()
{
printf("hello Eigen\n");
{
MatrixXf m1(300, 400);
MatrixXf m2(300, 400);
MatrixXf m3 = m1 + m2;
std::cout << m3.rows() << std::endl;
printf("bye\n");
} // set a debug break point in this line, expecting going into its destructor and free memory, but there isn't
printf("-----------------\n");
return 0;
}
作为对比,我简单地创建了一个张量模板class,当离开它的范围时,它的析构函数被调用:
template<class T>
class Tensor {
public:
int c, h, w;
int len;
T* data;
Tensor(int _c, int _h, int _w): c(_c), h(_h), w(_w) {
len = c * h * w;
data = new T[len];
}
~Tensor() {
if (data) {
free(data);
}
}
};
int main() {
// Tensor
{
printf("hello tensor\n");
Tensor<float> tensor(3, 2, 2);
printf("bye tensor\n");
} // set a debug break point here, Tensor class's destructor is called
return 0;
}
我的问题:Eigen 的大矩阵(已分配堆内存)何时何地释放其堆内存? 我如何看到它?
更新:我忘了说我使用的是 Visual Studio 2019 调试模式。
这是编译器和调试器的区别,在尝试了这个问题描述中注释中的不同工具和方法之后。
Visual Studio2019(直到2021-4-9,版本16.9.3)仍然无法调试进入DenseStorageclass的销毁功能。
同时,Visual Studio 2019 使用 clang-cl,lldb/gdb 使用 clang-10/g++-9.3 on Linux,都可以调试到 DenseStorage class的破坏函数。
我想写一个非常非常小的 matrix/tensor 库,功能最少,API 像 Eigen。
让我困惑的是,设置调试断点,并没有带我进入一些析构函数,我什么也没得到。
要重现,请使用此使用 Eigen 的代码段:
#include <Eigen/Dense>
#include <stdio.h>
#include <iostream>
using namespace Eigen;
int main()
{
printf("hello Eigen\n");
{
MatrixXf m1(300, 400);
MatrixXf m2(300, 400);
MatrixXf m3 = m1 + m2;
std::cout << m3.rows() << std::endl;
printf("bye\n");
} // set a debug break point in this line, expecting going into its destructor and free memory, but there isn't
printf("-----------------\n");
return 0;
}
作为对比,我简单地创建了一个张量模板class,当离开它的范围时,它的析构函数被调用:
template<class T>
class Tensor {
public:
int c, h, w;
int len;
T* data;
Tensor(int _c, int _h, int _w): c(_c), h(_h), w(_w) {
len = c * h * w;
data = new T[len];
}
~Tensor() {
if (data) {
free(data);
}
}
};
int main() {
// Tensor
{
printf("hello tensor\n");
Tensor<float> tensor(3, 2, 2);
printf("bye tensor\n");
} // set a debug break point here, Tensor class's destructor is called
return 0;
}
我的问题:Eigen 的大矩阵(已分配堆内存)何时何地释放其堆内存? 我如何看到它?
更新:我忘了说我使用的是 Visual Studio 2019 调试模式。
这是编译器和调试器的区别,在尝试了这个问题描述中注释中的不同工具和方法之后。
Visual Studio2019(直到2021-4-9,版本16.9.3)仍然无法调试进入DenseStorageclass的销毁功能。
同时,Visual Studio 2019 使用 clang-cl,lldb/gdb 使用 clang-10/g++-9.3 on Linux,都可以调试到 DenseStorage class的破坏函数。