2013-07-16 2 views
0

Я хотел бы, чтобы освободить следующие векторы после каждого использования:Высвобождения векторов векторов после использования

std::vector<std::array<double,640>> A(480); 
    std::vector<std::array<double,640>> B(480); 
    std::vector<std::array<double,640>> C(480); 
    std::vector<std::array<double,640>> D(480); 

Некоторые из всех векторов I'am, имеющими накапливают каждую секунду цикл несколько мегабайта от Commit, и я действительно не хочу этого, потому что я хочу использовать свое приложение в некоторых не очень мощных машинах.

Затем, как освободить эти векторы?

+3

Вы не делаете. Это хорошо. – chris

+0

A.clear() очистит вектор A –

+5

@someone_smiley: нет никакой гарантии, что реализация фактически освободит память вектора. – syam

ответ

3

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

привести пример

void reallyGreedyFunc() 
{ 
    // next allocates the memory for 480 fixed size arrays of 640 doubles on the heap 
    // only the management structures will be kept on the stack 
    std::vector<std::array<double,640>> A(480); 

    //... do something 
} // A goes out of scope and all the memory it has occupied is released 
3

Чтобы освободить содержимое vector, просто отпустите его из области действия или уничтожьте вместе с экземпляром класса, к которому он принадлежит (в зависимости от вашей конкретной ситуации).

Если вы не можете ждать так долго, вы всегда можете использовать старую добрую swap-with-empty идиомы, чтобы обеспечить память фактически освободила:

std::vector<std::array<double,640>>().swap(A); 
// or, nicer version using C++11's decltype, which avoids typing the exact type: 
decltype(A)().swap(A); 
+0

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

+0

@ ogni42 В зависимости от точного кода может оказаться необходимым/полезным избавиться от его содержимого до того, как оно выходит за рамки. Существует также та же проблема, если вектор является членом долгоживущего класса. В любом случае OP хочет полностью освободить память, используемую вектором, до того, как закончится его жизненный цикл, поэтому идиома обмена будет полезна. – syam

+0

Да, вы правы. Очистка памяти в долгоживущем классе - хороший вариант для этого. – ogni42

Смежные вопросы