2010-12-27 3 views
2

Я понятия не имею, что не так со следующим кодом! Я удаляю все указатели, но когда я использую команду «top» для просмотра памяти, я вижу, что все еще много памяти выделяется программе. Я что-то упустил, чтобы освободить память?Перераспределение вектора указателей, но память все еще используется

#include <iostream> 
#include <vector> 

using namespace std; 

int main() 
{ 
    vector<int*> container; 
    vector<int*>::iterator itr; 
    unsigned long long i; 

    for(i = 0; i < 10000000; i++) 
    { 
     int* temp = new int(); 
     *temp = 1; 
     container.push_back(temp); 
    } 

    for(itr = container.begin(); itr != container.end(); itr++) 
    { 
     delete *itr; 
     *itr = NULL; 
    } 

    container.clear(); 
    cout<<"\nafter clear\n"; 

    while(1) 
    { 
     sleep(1000000); 
    } 

    return 0; 
} 
+2

Верх не является программой, которую вы должны использовать, чтобы определить, есть ли у вас утечки памяти. – Falmarri

+0

Ваша память освобождена. Но память никогда не возвращается в ОС (пока процесс не завершится). Поэтому 'top' никогда не увидит, что память опустилась. –

+0

Если у вас есть настоящая программа, которую вы подозреваете утечки (не эта игрушка). Тогда вы должны запустить valgrind против него (что должно выявить большинство ваших проблем). В качестве альтернативы вы должны написать код C++, а не C, и использовать RAII –

ответ

5

В этом коде отсутствует утечка (предположим, что исключений не было выбрано после allcoation и до освобождения). Причина, по которой вы не видите падение памяти, заключается в том, что CRT не может сразу освободить память delete. Это может сохранить его для будущего использования. Тем не менее, гарантируется, что память будет освобождена после завершения процесса.

+0

Naveen, есть ли способ заставить ЭЛТ немедленно освободить память? В реальном приложении мы имеем дело с одной и той же проблемой. По истечении некоторого времени приложение заканчивается из-за нехватки памяти на сервере! Мы также проанализировали приложение с использованием Valgrind и не обнаружили утечки памяти. – Meysam

+0

Это вещь ОС. ОС должна вернуть память, когда она понадобится в другом месте. – Falmarri

+0

@Maysam: какая ОС? – Naveen

0

Как сказал Навен, в коде отсутствует утечка. Но, как вы пишете цикл, не рекомендуется. Вы могли бы легко использовать for_each() для удаления памяти. refer to this question in SO

+2

Почему эти циклы не рекомендуются? Просто потому, что они могут быть немного быстрее, поскольку компилятор может сделать еще несколько оптимизаций, но их гораздо проще читать и читать, чем для for_each, для которого требуется класс-функтор ... – mmmmmmmm

+0

Посмотрите на сообщение приращение итератора в цикле.Я ссылался на это.Но я мог быть более конкретным, хотя. В любом случае, он мог бы избежать этой проблемы, если бы использовал for_each. – Jagannath

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