2013-10-31 2 views
2

Я хочу, чтобы убедиться, что следующие работы, как я намереваюсь без утечек памяти:C++ 2D-вектор прозрачный работает по назначению?

vector<vector <float> > X; 
for (int i = 0; i < some_size; i++) 
{ 
    vector<float> column; 
    X.push_back(column); 
} 
// ... use 2D array somehow 
X.clear(); 
/* CALLS DESTRUCTOR OF EACH ELEMENT, BUT SINCE EACH ELEMENT 
IS A VECTOR, CLEAR IS RECURSIVELY CALLED ON EACH OF THOSE*/ 

То есть, это clear() рекурсивно применяется к векторам векторов из-за clear являющейся частью деструктор вектора осуществляется?

Я знаю, что X полностью очищается, когда он выходит из сферы действия, но здесь дело не в этом.

+11

Да. (вставить больше символов) – yngccc

+0

FYI, ваш цикл 'for' может быть упрощен до' X.resize (some_size) 'или вы можете просто создать его как' vector > X (some_size); ' –

ответ

3

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

clear is не гарантированно освобождает память, используемую на верхнем уровне.

+0

Да, это он. –

+0

Можете ли вы уточнить? Что вы подразумеваете под вершиной, X? Итак, что мне делать после clear(), если мне нужно сделать это до того, как X выходит за рамки? – Tommy

+0

@Tommy: «top» в этом контексте означает внешний вектор (первое измерение двумерного вектора, который вы создаете здесь). Поскольку каждый элемент в этом векторе также является вектором. Когда вы вызываете 'clear', он будет вызывать деструктор для каждого элемента (каждого из векторов) внутри него. Не гарантируется освобождение пространства * it * (что означает использование внешнего вектора). Если вы хотите это сделать, вы можете сделать это с помощью 'vector >(). Swap (X)', что эффективно уменьшит пропускную способность вектора до емкости по умолчанию реализации. –

3

Добавление ответа Zac ХАУЛЕНД, в качестве documentation для vector<T>::clear предполагает,

Перераспределение не гарантировано произойдет, а вектор емкость не гарантируется изменяться в связи с вызовом этой функции. Типичная альтернатива, которая заставляет перераспределить является использование свопа:

vector<T>().swap(x); // clear x reallocating 

Это будет поменять содержимое временного пустого вектора с теми x. Затем деструктор будет вызван для временного (ранее пустого) вектора, который, в свою очередь, вызовет деструкторы для всех его векторных элементов, и, наконец, все пространство будет освобождено.

+0

swap не перераспределяет –

+0

@ DieterLücking: Я не сказал, что это будет (на самом деле я даже не использовал это слово, выдержка из документации). В последнем абзаце я объясняю, почему пространство будет выделено ** **; это не 'swap', это делает его, это временный пустой вектор. – nickie

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