使用 std::vector<Eigen::MatrixXd> 进行内存管理
Posted
技术标签:
【中文标题】使用 std::vector<Eigen::MatrixXd> 进行内存管理【英文标题】:Memory management with std::vector<Eigen::MatrixXd> 【发布时间】:2013-10-13 17:46:58 【问题描述】:我靠一个std::vector
来持有大量的Eigen::MatrixXd
。作为 C++ 专家,我发现自己想知道使用这种结构正确管理内存分配的最佳方法是什么。特别是,我的问题是,将它用作类成员,如何释放类析构函数中分配的内存?
使用 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*>
有什么好处吗?
【问题讨论】:
std::vector
将在超出范围时销毁其元素。但是,如果您将指针存储在 std::vector
中,则必须自己释放内存
【参考方案1】:
你不需要做任何特别的事情。应该这样做:
class myClass
public:
//...
vector<MatrixXd> container;
//...
myClass();
~myClass();
;
myClass::myClass() : container(100, MatrixXd(100,100))
myClass::-myClass()
上面的代码在构造函数中创建了100个元素的向量,当对象超出析构函数的作用域时全部释放。
用矢量代替有什么好处吗?
不是真的。通过这样做,您只会使您的代码变得比您需要的更复杂。
【讨论】:
但是分配给矩阵的内存呢?我仅使用值 100 作为示例,实际上它在编译时并不真正知道(我有一些采用不同参数的重载构造函数)。我记得在 Eigen 论坛的某个地方读到我应该将矩阵的大小调整为 (0,0) 以释放分配的内存 (forum.kde.org/viewtopic.php?f=74&t=87242) @joaocandre myClass 的析构函数将销毁向量,它将调用 MatrixXd 的所有元素的析构函数,这将处理内存。那家伙想在对象超出范围之前释放内存。在析构函数中,myClass 的对象已经超出范围【参考方案2】:MatrixXd
作为项目类型的析构函数将在析构std::vector
期间被调用。所以不用担心删除它们。 std::vector::~vector()
:
破坏容器。元素的析构函数称为 并且使用的存储被释放。请注意,如果元素是 指针,指向的对象不会被销毁。
【讨论】:
【参考方案3】:C++ 中类的良好设计的全部意义在于,当您破坏它们时,它们会正确释放它们所拥有的资源。由于std::vector
和MatrixXd
都设计正确,所以您根本不需要做任何事情。你的析构函数可以是空的。
这是您在从 C 到 C++ 时绝对必须做的的重大心理飞跃。在 C++ 中,如果您可以毫不费力地简单地破坏它,则认为一个类是体面的。类可破坏的事实应该是不变的——在类实例存在的所有时间点,所述实例都应该是可破坏的。当你破坏这个类时,它应该释放它所拥有的所有资源。
未能释放资源是 C 风格设计中无尽悲痛的根源,在这种设计中,您没有按照应有的方式利用 C++。
【讨论】:
以上是关于使用 std::vector<Eigen::MatrixXd> 进行内存管理的主要内容,如果未能解决你的问题,请参考以下文章
将数据从 std::Vector 存储到 Eigen::Vector 时出错 [重复]
如何调整 Eigen::MatrixXd 的 std::vector 的大小