2013-10-13 84 views
0

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

使用std :: vector; 使用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*>代替它有什么优势吗?

+1

'std :: vector'在超出范围时将销毁它的元素。然而,如果你将指针存储在'std :: vector'中,你将不得不自己释放内存。 – Kunal

回答

3

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

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

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

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

myClass::-myClass(){ 
} 

上面的代码建立在构造100个元件的载体,并且当所述对象超出范围在析构函数所有被释放。


,并没有使用矢量,而不是什么优势?

不是。通过这样做,您只需将代码复杂化即可。

+0

但是为矩阵分配的内存呢?我只是将值100用作一个例子,实际上它在编译时并不真正知道(我有一些重载的构造函数采用不同的参数)。我记得在Eigen的某个地方读到,我应该调整矩阵的大小(0,0)以释放分配的内存(http://forum.kde.org/viewtopic.php?f=74&t=87242) – joaocandre

+0

@joaocandre The myClass的析构函数将销毁向量,该向量将调用MatrixXd所有元素的析构函数,并将处理内存。那个人想在对象超出范围之前释放内存。在析构函数中,myClass的对象已经超出了范围 –

2

MatrixXd的破坏者将在销毁std::vector期间调用该项目类型。所以不要担心删除它们。 std::vector::~vector()

破坏容器。元素的析构函数被称为 ,并且已使用的存储被重新分配。请注意,如果元素是指针,则指向的对象不会被销毁。

1

C++中良好的类设计的关键在于,当它们被破坏时,它们会正确释放它们所持有的资源。由于std::vectorMatrixXd的设计都是正确的,所以根本不需要做任何事情。你的析构函数可以是空的。

这是你从012 C到C++时绝对必须做的这个大的心理飞跃。在C++中,如果你可以简单地破坏它,而不需要任何进一步的修改,就可以认为它是一个体面的。类可破坏的事实应该是不变的 - 在类实例存在的所有时间点上,所述实例应该是可破坏的。当你破坏这个类时,它应该释放它所拥有的全部资源。

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

相关问题