Останавливаем утечки памяти. Основная идея Выделение памяти должно быть под контролем – нужен свой инструмент. Инструмент будет показывать статистику.

Презентация:



Advertisements
Похожие презентации
ООП Классы Данные отдельно, методы отдельно struct Node { Node* next; void* data; }; struct List { Node* first; int size; }; void* allocate() { … } void.
Advertisements

Чтобы вывести прописную букву в начале предложения, следует нажать: А) CapsLock Б) Shift + буква В) Ctrl + буква.
Двумерные динамические массивы. Двумерный массив - это одномерный массив, элементами которого являются одномерные массивы. Другими словами, это набор.
Фрагмент рисунка – это выделенная область графического изображения.
Запуск среды Turbo Pascal.Сохранение и выполнение программы.
Основы информатики Лекция. Массивы. Указатели. Заикин Олег Сергеевич
Тема урока: Операции с папками и файлами. Создание папок и файлов Открыть папку, в которой необходимо создать папку или файл. Открыть папку, в которой.
Основы информатики Массивы. Указатели. Заикин Олег Сергеевич
Под объявлением одномерного динамического массива понимают объявление указателя на переменную заданного типа для того, чтобы данную переменную можно.
Лекция 14 Динамические данные. Виды памяти Существует три вида памяти: статическая, стековая и динамическая. Статическая память выделяется еще до начала.
Лекция 8 Область видимости Время жизни. Область видимости Область видимости – характеристика именованного объекта Область видимости - часть текста программы,
Указатели Динамические структуры данных. 2 Статические данные переменная (массив) имеет имя, по которому к ней можно обращаться размер заранее известен.
Перед началом работы в папке своего класса создайте свою папку.
Тема: Работа с фрагментами текстов. Текстовый редактор Word позволяет выделить любую часть текста с целью проведения над этой частью необходимых операций.
Учимся работать на персональном компьютере Лаборатория информатизации образования.
Д.з Язык С++ - занятие 31. Задача 1: 1/1 + 1/3 + 1/5 … #include using namespace std; int main() { int n; cin >> n; double sum = 0;// Сумма for.
Архивация файлов Файлы и файловая система. Архиваторы Программы, осуществляющие сжатие (упаковку файлов), называют архиваторами. При сжатии можно уменьшить.
Проверка правописания. Вверяет текст, опираясь на словарь из 240 тысяч основ русских слов, что соответствует приблизительно четырем миллионам различных.
Тема урока: ГКУ НПО ПУ 4 Редактирование текста Тема программы: Работа в текстовом редакторе Microsoft Word 2010.
Тема. Редактирование графических изображений. Понятие буфера обмена Герасимович Л.И., учитель ОШ 4,г.Краматорск.
Транксрипт:

Останавливаем утечки памяти

Основная идея Выделение памяти должно быть под контролем – нужен свой инструмент. Инструмент будет показывать статистику выделения памяти по файлам и файлам/строчкам. Мы будем выделять и освобождать память так, чтобы инструмент знал об этом.

Инструмент Shift-S – выводит в лог информацию о выделенной памяти в текущий момент и сохраняет информацию о выделенной памяти на данный момент. Alt-M, Ctrl-M – выводят информацию о выделении памяти по файлам и файлам/строчкам. Если нажимался Shift-S, то выводится и разница по объему выделенной памяти относительно запомненного момента.

Alt-M

Ctrl-M

Подключение инструмента к С++ В stdafx.h проекта добавляем #define MEMORY_PROFILING1 #include "MemoryProfilerCreate.h К проекту подключаем DLL-библиотеку nmemoryprofiler. Если дефайн закомментировать, статистика по проекту собираться не будет. ВНИМАНИЕ! Статистика работает даже в Release- конфигурации, её сбор может быть медленнным. Комментируйте дефайн до выкладки.

Выделение памяти Вместо float* a = new float float* a = MP_NEW(float) Вместо С3DObject* a = new С3DObject(); С3DObject* a = MP_NEW(C3DObject); Вместо float* a = new float[100]; float* a = MP_NEW_ARR(float, 100);

Выделение памяти Вместо С3DObject* a = new С3DObject(10); MP_NEW_P(a, C3DObject, 10); Вместо С3DObject* a = new С3DObject(1, 2); MP_NEW_P2(a, C3DObject, 1, 2); Вместо С3DObject* a; а = new С3DObject(1, 2); С3DObject* a; MP_NEW_V2(a, C3DObject, 1, 2);

Освобождение памяти Вместо delete a; MP_DELETE(a);// после a = NULL Вместо delete[] a; MP_DELETE_ARR(a); // после a = NULL Вместо delete this; MP_DELETE_THIS; Вместо delete GetTexture(); MP_DELETE_UNSAFE(GetTexture()); Вместо delete[] GetData(); MP_DELETE_ARR_UNSAFE(GetData());

Как избежать ошибок? Удаления вида new/delete[] и new[]/delete отслеживаются. Будет assert. Когда память где-то удалилась, а по тому же указателю выделяется новая область память, тоже отслеживается. Будет assert. Перед ассертом, нужная информация сбрасывается в лог.

ВОПРОСЫ?