我依靠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*>
取代有什么优势吗?
答案 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::vector
和MatrixXd
都设计正确,因此您根本不需要做任何事情。你的析构函数可能是空的。
从C到C ++,这是你绝对必须做的的重大突破。在C ++中,如果你可以在没有任何进一步的麻烦的情况下简单地破坏它,那么它就被认为是一个很好的类。类是可破坏的这一事实应该是一个不变量 - 在类实例存在的所有时间点,所述实例应该是可破坏的。当你破坏这个类时,它应该释放它拥有的所有资源。
未能释放资源是C风格设计中无尽悲伤的根源,在这种设计中,您不会像使用C ++那样利用C ++。