Как правильно уничтожить вектор векторов и освободить память С++

Возможный дубликат:
Как освободить std::vector, если нет кучной памяти

С++ noob здесь

Предположим, что я объявляю вектор векторов типа:

vector<vector<vector<double> > > phi_x;

После того как я закончил использовать его, как я могу его уничтожить, чтобы освободить память?

Я читал некоторые другие сайты, и они рекомендуют использовать .clear(). По моему мнению, это только удаляет элементы, но векторная емкость не освобождается. Я хочу, чтобы вектор был полностью забыт, как никогда не существовал.

Кроме того, мое текущее приложение вектора имеет размеры 54x54x9, и у меня есть около 12 из этих вещей. Это считается глупо большим?

Ответ 1

Вам не нужно ничего делать. Просто дайте переменной выйти из области видимости.

Ответ 2

Если вы вызываете .clear(), внутренние векторы будут полностью уничтожены. Однако самый внешний вектор может сохранить память, которую он использовал для своего массива векторов (phi_x.size() * sizeof(vector<vector<double> >) bytes). Чтобы полностью очистить его и освободить всю память, поменяйте его на пустой вектор:

phi_x.swap(vector<vector<vector<double> > >());

Или просто отпустите phi_x из области видимости.

Ответ 3

После того как я закончил использовать его, как мне его уничтожить, чтобы освободить память?

Просто позвольте ему выйти из области видимости.

мое текущее приложение вектора имеет размеры 54x54x9, и у меня есть около 12 из этих вещей. Это считается глупо большим?

Это зависит. Если это для встроенной платформы с 64-разрядной памятью, то да, она большая. Если это для стандартных настольных ПК с 4G + RAM, тогда его можно пренебречь.

Ответ 4

Вам не нужно ничего делать, деструктор будет правильно очищаться.

Если вы хотите освободить использование памяти до того, как она выходит из области видимости, вы можете очистить верхний уровень. Это не приведет к перераспределению памяти, используемой верхним вектором, но приведет к удалению всех содержащихся векторов, и они освободят свою память в своих деструкторах.

Это около 1 миллиона элементов типа double, если я правильно вычислил. Предполагая, что современный ПК является платформой, которая не является тупой большой. Или даже очень большой:)

Ответ 5

Если ваша переменная phi_x - это некоторая локальная переменная внутри какого-либо блока, она будет уничтожена путем вызова ее деструктора в конце блока.

Если это глобальная переменная, она будет уничтожена после завершения main.

Ответ 6

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

Это произойдет, как только функция, объявленная в пределах выходов, или если объект, в котором он живет, разрушен.

Ответ 7

Деструктор выполнит работу по очистке для вас. Вам не нужно ничего делать, но пусть phi_x выходит за рамки.

{
    vector<vector<vector<double> > > phi_x;

    // do stuff with phi_x
}
// phi_x is gone here