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的破坏函数。