Я полагаюсь на 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()
, поскольку я уже изменил размер матрицы Eigen на (0,0) или мне нужно использовать delete
? И есть ли преимущество при использовании vector<MatriXd*>
вместо этого?
Вам не нужно ничего особенного делать. Это должно сделать:
class myClass{
public:
//...
vector<MatrixXd> container;
//...
myClass();
~myClass();
};
myClass::myClass() : container(100, MatrixXd(100,100)){
}
myClass::-myClass(){
}
Вышеприведенный код создает вектор из 100 элементов в конструкторе, и все освобождается, когда объект выходит из области действия в деструкторе.
И есть ли преимущество в использовании вектора вместо этого?
На самом деле, нет. Делая это, вы просто усложняете свой код больше, чем вам нужно.
Деструктор MatrixXd
в качестве типа элемента будет вызываться во время разрушения std::vector
. Поэтому не беспокойтесь об их удалении. std::vector::~vector()
:
Уничтожает контейнер. Вызывается деструкторы элементов, и используемое хранилище освобождается. Обратите внимание, что если элементы являются указателями, объекты с указателем не уничтожаются.
Весь смысл хорошего дизайна классов в C++ заключается в том, что когда вы их уничтожаете, они должным образом освобождают ресурсы, которые они хранят. Поскольку и std::vector
и MatrixXd
разработаны правильно, вам не нужно ничего делать вообще. Ваш деструктор может быть пустым.
Это большой умственный прыжок, который вы абсолютно должны делать, переходя от C к C++. В C++ класс считается прилично сделанным, если вы можете просто уничтожить его без каких-либо дополнительных аплодисментов. Тот факт, что класс является разрушаемым, должен быть инвариантом - во все моменты времени, пока существует экземпляр класса, указанный экземпляр должен быть разрушаемым. Когда вы разрушаете класс, он должен освобождать все ресурсы, которые он хранит.
Невыполнение ресурсов является источником бесконечного горя в дизайне C-стиля, где вы не используете C++ способ, которым он должен был использоваться.