2017-01-31 12 views
-3

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

Я запустить Memory Leak Test в Visual Studio (_CrtDumpMemoryLeaks()) и выводит огромный список обнаруженных утечек (только показывая небольшую часть):

{1640} normal block at 0x081C2AB0, 4 bytes long. 
Data: <; > 3B 00 00 00 
{789} normal block at 0x08B792E8, 12 bytes long. 
Data: <   > 00 00 00 00 00 00 00 00 00 00 00 00 
{788} normal block at 0x027E62D8, 32 bytes long. 
Data: <   L L > 20 A8 FE 07 A0 A0 17 08 E4 4C F3 07 D8 4C F3 07 
{787} normal block at 0x027E6328, 32 bytes long. 
Data: <layer03 - Object> 6C 61 79 65 72 30 33 20 2D 20 4F 62 6A 65 63 74 
{786} normal block at 0x08B79748, 8 bytes long. 
Data: <`N  > 60 4E F3 07 00 00 00 00 

Я не могу на самом деле цифра что именно я сделал неправильно. Я следил за подсказками от another question of mine и заменил все new/delete вещами умными указателями (или, по крайней мере, я думаю, что сделал).

Причина, по которой я спрашиваю, потому что я столкнулся с увеличением объема памяти и размера кучи во время запуска моей программы, и я не уверен, если это серьезная проблема или просто какое-то базовое поведение.

Возьмите мой (сам написанный) графический интерфейс, например:

std::shared_ptr<Gui_Button> gui_modal_window_map_saved_button; 

И теперь я называю его:

gui_modal_window_map_saved_button.reset(new Gui_Button(res_handler, "Select", 20, 345, 70, 40, BUTTON_CONFIRM)); 

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

На данный момент я мою кнопку на кнопку «новый» «удаление» с reset()

if (g_ev.event_id == EVENT_CLICKED && g_ev.element == gui_modal_window_map_saved_button.get()) { 
     gui_modal_window_map_saved.reset(); 
     gui_modal_window_map_saved_button.reset(); 
    } 

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

Возвращаясь к первоначальному вопросу

я получаю эти дампы утечек памяти с помощью Visual Studio, но я действительно не могу понять, как использовать эту информацию. Что именно вызывает утечку памяти? Теперь я использую только «обычные» указатели, в которых мне нужно передать что-то другому классу, т. Е. И заменить все new/deletes интеллектуальными указателями. Я действительно не могу показать свой код, потому что это около 3000 строк.

Итак, что именно вызывает утечку памяти и как я использую информацию, предоставленную VS?

+0

Это общий вопрос? – elasticman

+0

Утечки памяти не об оборудовании, если вы не оставите свой ноутбук под дождем ... –

+0

Серый район. Я бы сказал, что утечка памяти - это общий вопрос. –

ответ

0

Microsoft предоставила подробную информацию о том, как использовать данные, которые вы видите: https://msdn.microsoft.com/en-us/library/x98tx3cf.aspx

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

{789} normal block at 0x08B792E8, 12 bytes long.

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

Другое дело, что утечка происходит внутри вашего класса.Если в вашем объекте есть какие-либо элементы, которые не удалены должным образом, интеллектуальный указатель не спасет вас.

+0

«Если вы не видите увеличение записей об утечках в конце вашего прогона, у вас нет растущей утечки». - Не могли бы вы объяснить, что дальше? Как измерить записи в конце прогона? – elasticman

+0

Подсчитайте их. Если есть больше, чем вы можете быстро подсчитать, то это не имеет значения, если он растет. У вас достаточно проблем, как есть. –

0

C++ отличается от многих новых языков тем, что у него нет так называемого сборщика мусора. Вы выделяете (заявляете) память new и явно освобождаете (освобождаете) ее снова delete.

Если вы забыли delete, память будет освобождена только операционной системой после вашей программы.

Чтобы сбалансировать использование new с использованием delete, по возможности распределите память только в конструкторах и освободите ее в (виртуальных) деструкторах. Таким образом, если объект, владеющий куском памяти кучи (память, выделенная new), выходит за пределы области видимости (например, локальная переменная при выходе из функции), память будет автоматически освобождена.

Кстати, выделение и освобождение памяти таким образом является одной из вещей, которая дает C++ ее универсальность и скорость. Так что это скорее средство, чем нечто, чего можно избежать. Но это требует осторожного использования.

+0

Да, это то, что я узнал. Но, если я не буду явно называть новое, тогда у меня не должно возникнуть проблем, не так ли? – elasticman

+0

Действительно, вы не должны. –

+1

В каком-то другом ответе я читал, что возможно, что я вызываю _CrtDumpMemoryLeaks(); в неприемлемом месте. В настоящее время я разместил его прямо до конца моей программы (до возврата 0;) – elasticman

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

  • Нет связанных вопросов^_^