0

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

使用标准::向量;使用 Eigen::MatrixXd;

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

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

的构造函数和析构函数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*>吗?

4

3 回答 3

3

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

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

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

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

myClass::-myClass(){
}

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


使用矢量有什么好处吗?

并不真地。通过这样做,您只会使您的代码变得比您需要的更复杂。

于 2013-10-13T18:01:56.167 回答
2

作为项目类型的析MatrixXd构函数将在析构过程中被调用std::vector。所以不用担心删除它们。std::vector::~vector()

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

于 2013-10-13T18:04:19.200 回答
1

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

这是从 C 到 C++ 时您绝对必须做的重大心理飞跃。在 C++ 中,如果您可以毫不费力地简单地破坏它,则认为一个类是体面的。类是可破坏的这一事实应该是不变的——在类实例存在的所有时间点,所述实例都应该是可破坏的。当你破坏这个类时,它应该释放它拥有的所有资源。

未能释放资源是 C 风格设计中无尽悲痛的根源,在这种设计中,您没有按照本应使用的方式利用 C++。

于 2013-10-13T19:31:38.557 回答