Вопрос о Выделении памяти C++, включающий векторы

vector< int > vect;
int *int_ptr = new int(10);
vect.push_back( *int_ptr );

Я под стендом, который каждый "новые" потребности, которые будут сопровождаться "удалением" в какой-то момент, но делает ясное () метод, чищу эту память?

Что относительно этого метода выполнения того же самого:

vector< int > vect;
int int_var = 10;
vect.push_back( int_var );

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

5
задан TheFuzz 7 May 2010 в 20:39
поделиться

3 ответа

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

Второй метод не дает утечек, так как память не выделяется динамически (кроме внутренней памяти вектора - он сам будет обрабатывать эту память).

5
ответ дан 13 December 2019 в 05:31
поделиться

Векторы копируют в push_back . Поскольку указатель - это `` просто другая переменная '' (но та, которая указывает на память), когда вы push_back целочисленный указатель, который был ранее выделен, вы копируете значение указателя в вектор, вызывая потенциальный висячий указатель, поскольку будет быть двумя указателями, указывающими на одно и то же место в памяти.

В вашем первом примере вам нужно будет удалить память вручную. Одна стратегия, которую я использовал в прошлом для вмешательства в классы графов, - это иметь что-то вроде этого (огромное количество материала отредактировано из-за того, что я был на работе и быстро печатал):

class graph //quick-format
{
vector<node*> nodes;
add_node(node n)
{
  node *temp = new node; 
  *temp = n; 
  nodes.push_back(temp) 
}
~graph()
{ 
   for(int i = 0; i < nodes.size(); i++) 
      delete nodes[i]; 
}
};

В качестве предостережения, семантика копирования графа должна быть осмотрел. В нынешнем виде это приведет к удалению ранее освобожденной памяти. Преимущество в том, что у вас всегда может быть один и тот же набор узлов. Caveat Emptor , как и любое прямое использование памяти ..

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

2
ответ дан 13 December 2019 в 05:31
поделиться

Когда вы push_back для вектора , вы добавляете копию данных в вектор. Следовательно, в обоих случаях исходные данные все равно необходимо освободить. В первом случае его нужно удалить; во втором он будет "освобожден" указателем стека, поскольку он выходит за пределы области видимости.

5
ответ дан 13 December 2019 в 05:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: