2010-11-27 1 views
0

Следующий код приводит к утечке памяти:Динамически выделяется массив внутри станд :: список приводит к memoy утечки

std::list<float*> vertices; 

    float* v; 
    for (int i = 0; i < 50000; i++){ 
     v = new float[3]; 
     v[0] = v[1] = v[2] = 13; 

     vertices.push_back(v); 
    } 

    std::list<float*>::iterator curr; 
    for(curr = vertices.begin(); curr != vertices.end(); curr++) { 
     delete[] *curr; 
    } 

    vertices.clear(); 

Я понятия не имею, почему это происходит, но я предполагаю, что это связано с какой-то аномалией станд :: список. Более странная часть заключается в том, что если я буду запускать код более одного раза, количество просочившейся памяти не изменится. Может быть, я пропустил что-то действительно основное?
Может ли кто-нибудь предложить причину этого? Могу ли я решить эту проблему только с изменением части уничтожения кода?

Дополнительная информация:
Это приложение mfc. Код выполняется при нажатии кнопки. Прежде чем нажать кнопку, я вижу в диспетчере задач 15 МБ. После того, как я нажимаю кнопку, я вижу 40 МБ. Кнопка ничего не делает, кроме выполнения этого кода.

+0

Почему, по вашему мнению, здесь происходит утечка памяти? – ronag 2010-11-27 20:14:30

+0

Сколько просачивается память? – suszterpatt 2010-11-27 20:15:49

ответ

6

Вы неправильно интерпретируете свои результаты. «Утечка», которую вы видите, на самом деле не является утечкой, а является предварительным распределением, которое в основном там, где CRT или STL поддерживают выделенную память, вам нужно снова ее для более быстрого времени распределения.

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

Редактировать: Менеджер задач НЕ является надежным способом измерения распределения/освобождения/etc. Это даже не выделяет 25 МБ.

Еще править: вам даже не нужно было бы проверять, не использовали ли вы правильные указатели RAII вместо необработанных указателей.

3

Не могу видеть любую утечку памяти в коде ...

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

eg

typedef std::array<float, 3> vec3; 
std::vector<vec3> vertices; 

for (int i = 0; i < 50000; i++) 
{ 
    vec3 v = {13, 13, 13}; 
    vertices.push_back(v); 
} 

vertices.clear();