使用std :: vector <eigen :: matrixxd> </eigen :: matrixxd>进行内存管理

时间:2013-10-13 17:46:58

标签: c++ class vector eigen

我依靠std::vector来容纳大量Eigen::MatrixXd。不是C ++专家,我发现自己想知道用这种结构正确管理内存分配的最佳方法是什么。特别是,我的问题是,如何将它作为类成员使用,如何在类析构函数中释放已分配的内存?

使用std :: vector; 使用Eigen :: MatrixXd;

Class myClass{
    //...
    vector<MatrixXd> container;

    //...
    myClass();
    ~myClass();
}

构造函数&amp; myClass的析构函数:

myClass::myClass(){
    //...
    container=vector<MatrixXd>(100);
    for (int i=0; i<container.size(); i++) container[i]=MatrixXd::Zero(100,100);
    //...
}

myClass::-myClass(){
    //...
    for (int i=0; i<container.size(); i++) container[i].resize(0,0);
    container.clear();
    //...
}

仅仅调用clear()就足够了,因为我已经将特征矩阵的大小调整为(0,0),或者我是否需要使用delete?使用vector<MatriXd*>取代有什么优势吗?

3 个答案:

答案 0 :(得分:3)

你不需要做任何特别的事情。这应该做:

class myClass{
public:
    //...
    vector<MatrixXd> container;

    //...
    myClass();
    ~myClass();
};

myClass::myClass() : container(100, MatrixXd(100,100)){
}

myClass::-myClass(){
}

上面的代码在构造函数中创建了100个元素的向量,当对象超出析构函数范围时,所有元素都被释放。


  

使用矢量是否有任何优势?

不是真的。通过这样做,您只需要将代码复杂化,然后再进行操作。

答案 1 :(得分:2)

在销毁MatrixXd期间将调用作为项类型的std::vector的析构函数。所以不要担心删除它们。 std::vector::~vector()

  

破坏容器。调用元素的析构函数   并且已释放使用的存储空间。注意,如果元素是   指针,指向的对象不会被破坏。

答案 2 :(得分:1)

C ++中良好的类设计的全部意义在于,当你破坏它们时,它们会正确地释放它们所拥有的资源。由于std::vectorMatrixXd都设计正确,因此您根本不需要做任何事情。你的析构函数可能是空的。

从C到C ++,这是你绝对必须做的的重大突破。在C ++中,如果你可以在没有任何进一步的麻烦的情况下简单地破坏它,那么它就被认为是一个很好的类。类是可破坏的这一事实应该是一个不变量 - 在类实例存在的所有时间点,所述实例应该是可破坏的。当你破坏这个类时,它应该释放它拥有的所有资源。

未能释放资源是C风格设计中无尽悲伤的根源,在这种设计中,您不会像使用C ++那样利用C ++。