Управление памятью с помощью std :: vector <Eigen :: MatrixXd>

0

Я полагаюсь на 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
eigen
vector

3 ответа

3
Лучший ответ

Вам не нужно ничего особенного делать. Это должно сделать:

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

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

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

myClass::-myClass(){
}

Вышеприведенный код создает вектор из 100 элементов в конструкторе, и все освобождается, когда объект выходит из области действия в деструкторе.


И есть ли преимущество в использовании вектора вместо этого?

На самом деле, нет. Делая это, вы просто усложняете свой код больше, чем вам нужно.

  • 0
    Но как насчет памяти, выделенной для Матриц? Я использовал значение 100 только в качестве примера, на практике оно не очень известно во время компиляции (у меня есть несколько перегруженных конструкторов, которые принимают разные аргументы). Я помню, как читал где-то в Eigen foruns, что я должен изменить размеры матриц до (0,0), чтобы освободить выделенную память ( forum.kde.org/viewtopic.php?f=74&t=87242 )
  • 0
    @joaocandre Деструктор myClass собирается уничтожить вектор, который вызовет деструктор MatrixXd для всех элементов, и он позаботится о памяти. Этот парень хотел освободить память, прежде чем объект выйдет из области видимости. В деструкторе объект myClass уже находится вне области видимости
2

Деструктор MatrixXd в качестве типа элемента будет вызываться во время разрушения std::vector. Поэтому не беспокойтесь об их удалении. std::vector::~vector():

Уничтожает контейнер. Вызывается деструкторы элементов, и используемое хранилище освобождается. Обратите внимание, что если элементы являются указателями, объекты с указателем не уничтожаются.

1

Весь смысл хорошего дизайна классов в C++ заключается в том, что когда вы их уничтожаете, они должным образом освобождают ресурсы, которые они хранят. Поскольку и std::vector и MatrixXd разработаны правильно, вам не нужно ничего делать вообще. Ваш деструктор может быть пустым.

Это большой умственный прыжок, который вы абсолютно должны делать, переходя от C к C++. В C++ класс считается прилично сделанным, если вы можете просто уничтожить его без каких-либо дополнительных аплодисментов. Тот факт, что класс является разрушаемым, должен быть инвариантом - во все моменты времени, пока существует экземпляр класса, указанный экземпляр должен быть разрушаемым. Когда вы разрушаете класс, он должен освобождать все ресурсы, которые он хранит.

Невыполнение ресурсов является источником бесконечного горя в дизайне C-стиля, где вы не используете C++ способ, которым он должен был использоваться.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню