C ++ Вопрос распределения памяти с участием векторов - PullRequest
5 голосов
/ 08 мая 2010
vector< int > vect;
int *int_ptr = new int(10);
vect.push_back( *int_ptr );

Я понимаю, что за каждым «новым» в какой-то момент должно следовать «удаление», но очищает ли память метод clear ()?

Как насчет этого метода выполнениято же самое:

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

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

Ответы [ 3 ]

5 голосов
/ 08 мая 2010

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

5 голосов
/ 08 мая 2010

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

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

2 голосов
/ 08 мая 2010

Векторы делают копии на 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 , как любое прямое использование памяти ..

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...