如何解决Eigen 矩阵什么时候释放堆内存?
我想编写一个非常非常小的矩阵/张量库,具有最少的功能,以及像 Eigen 这样的 API。
让我困惑的是,设置调试断点,并没有带我进入一些析构函数,我什么也没得到。
要重现,请使用此使用 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;
}
作为对比,我简单地创建了一个 Tensor 模板类,当离开它的作用域时,它的析构函数被调用:
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 Studio 2019(直到 2021-4-9,版本 16.9.3)仍然无法调试进入 DenseStorage 类的销毁函数。
虽然,Linux 上带有 clang-cl 的 Visual Studio 2019 和带有 clang-10/g++-9.3 的 lldb/gdb 都可以调试到 DenseStorage 类的销毁函数中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。