2013-02-15 2 views
0

Привет, У меня есть следующий код, он принимает узлы от slaveQueue и preload до preload1 и preload2, но память всегда увеличивается. Я предполагаю, что он должен быть выпущен после вызова dfs, поскольку вся память должна быть освобождена после возвращения локальной функции, и я проверил, что функция pop() также освободит память? так что я задаюсь вопросом, где моя утечка памяти? БлагодаряC++ Ошибка памяти

queue<Graphnode> *preload1 = new queue<Graphnode>; 
    queue<Graphnode> *preload2 = new queue<Graphnode>; 
    for(int n = windowWidth; n > 0; n--) 
    { 
     if((*slaveQueue).empty()) 
     { 
      //cout <<"fffffffffffff"<<endl; 
      break; 
     } 
     (*preload2).push((*slaveQueue).front()); 
     //cout << (*slaveQueue).size()<<endl; 
     (*slaveQueue).pop(); 
    } 
    int preload1No =0; 

    while(!(*preload2).empty()) 
    { 
     preload1No++; 
     *slaveroot = (*preload2).front(); 
     (*preload2).pop(); 
     if(!(*slaveQueue).empty()) 
     { 
      (*preload2).push((*slaveQueue).front()); 
      (*slaveQueue).pop(); 
     } 
     dfs(*slaveroot,goal,totalDepth,*preload1,*preload2,checkfile); 
     if(preload1No>windowWidth) 
     { 
      (*preload1).push(*slaveroot); 
      (*preload1).pop(); 
     } 
     else 
     { 
      (*preload1).push(*slaveroot); 
     } 
     cout<<(*preload1).size()<<"\t"<<(*preload2).size()<<endl; 
    } 
    delete slaveroot; 
    delete preload1; 
    delete preload2; 
    delete slaveQueue; 
+1

для каждого 'нового' вам нужно' delete', и для каждого 'delete' вам нужно' new'. Ваш код выглядит хорошо, потому что вы не передадите копию своего прохода указателю на. – andre

+0

Лучше все еще - читайте о RAII, избегайте 'нового', когда вы можете –

+0

Возможно, вы изучили Java или C#? –

ответ

1

The a в func1 это передать по значению, которое означает, что его в стеке. Следовательно, он не будет создавать любые утечки памяти. Он выдается, когда выходят func.

+0

так что если есть утечка памяти, я не должен думать о переменных в любой функции? – weeo

+0

Вы должны использовать профилировщик и использовать инструменты, такие как valgrind, для поиска утечки памяти. Не забудьте «удалить» все «новые» данные, и вы почти всегда будете в безопасности. Также используйте STL, чтобы помочь вам справиться со сложностью вашего приложения. –

0

Ваш код, как показано, не имеет утечек памяти.

+0

Как часто вы можете так говорить !? – ipmcc

0

Он создает копию a в стеке. Но эта память восстанавливается, как только функция возвращается.

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

2

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

+0

Поскольку я написал этот ответ, текст в вопросе был ПОЛНОСТЬЮ изменен, и этот ответ имеет мало смысла для кода в вопросе). –

1

Если вы явно не выделяете какую-либо память в func1 и не вызываете никакой функции, которая делает это, тогда утечки памяти не происходит. Все, что вы копируете в функцию, - это указатель. Скопированный указатель сам по себе находится в стеке функции, и после возвращения функции он появляется вместе со всем остальным в области функции.

0

Когда вы передаете a к вашей функции, то копия a сама по себе проходит. Когда функция выйдет, эта копия a будет уничтожена. Память, которую a указывает на, совсем не копируется в вашем коде.

Ваш код утечки один байт памяти потому, что вы вызываете func1 в бесконечном цикле, так что delete a; никогда не будет выполняться. Однако, когда большинство людей говорят/думают о утечке памяти, они думают о «прогрессивных» утечках - те, которые вызывают больше памяти, чем дольше работает программа.


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