Здравствуйте, Господа.
Не подскажете ли, как узнать сколько реально памяти для массива было выделено с помощью оператора new или удалено с помощью оператора delete? Если к каждому new размер можно посчитать руками, то с delete так не выйдет. Дело в том, что моя программа где-то выделяет (не удаляет) слишком много памяти, а ошибку я найти никак не могу.
Здравствуйте Алексей Данилович, Вы писали:
АД> Дело в том, что моя программа где-то выделяет (не удаляет) слишком много памяти, а ошибку я найти никак не могу.
С помошью new на Win32 платформе выделяеться ((size/16)+1)*16 байт, ну или поменяйте 16 на свой размер параграфа...
С помошью delete в ЛЮБОМ СЛУЧАЕ освобождаеться столько же сколько выделенно.
Если выделяеться и освобожаеться РАЗНОЕ количество памяти то это глюк OS :))
Я бы посоветол поискать ПРОПУЩЕННЫЙ delete, варианты когда выделялось с помошью new[], а освобождалось delete и наоборот, выделялось new, а освобождалось delete[] и на ошибки в деструкторах соответственно.
Здравствуйте Алексей Данилович, Вы писали:
АД>Дело в том, что моя программа где-то выделяет (не удаляет) слишком много памяти, а ошибку я найти никак не могу.
А как вы это узнали?
Попробуйте BoundsChecker — иногда показывает утечки
// #import <windows.bas> class IWindows9x:protected DOS { private: virtual HANDLE EnumClouds()=0; };
Re[2]: Отладка распределения памяти
От:
Аноним
Дата:
10.05.02 17:45
Оценка:
Здравствуйте adontz, Вы писали:
A>С помошью new на Win32 платформе выделяеться ((size/16)+1)*16 байт, ну или поменяйте 16 на свой размер параграфа...
A>С помошью delete в ЛЮБОМ СЛУЧАЕ освобождаеться столько же сколько выделенно. A>Если выделяеться и освобожаеться РАЗНОЕ количество памяти то это глюк OS :)) A>Я бы посоветол поискать ПРОПУЩЕННЫЙ delete, варианты когда выделялось с помошью new[], а освобождалось delete и наоборот, выделялось new, а освобождалось delete[] и на ошибки в деструкторах соответственно.
Представьте себе, все это я уже пробывал — не помогло. Ситуация еще в том, что я хотел каким-либо образом выяснить — в какой функции сколько памяти выделяется и сколько удаляется, а затем посчитать сумму и выяснить место, где теряется память. Кроме того, ошибка скорее всего ни системная, а моя. Где-то я умудрился (это понятно из смысла и ручных прикидок) выделить памяти больше чем нужно на порядок, а где — не понимаю. Подсчет такой суммы дал бы мне (надеюсь) нужную катину. Вопрос: можно ли узнать, сколько памяти удалилось после вызова delete?
Re[2]: Отладка распределения памяти
От:
Аноним
Дата:
12.05.02 14:10
Оценка:
Здравствуйте adontz, Вы писали:
A>Здравствуйте Алексей Данилович, Вы писали:
АД>> Дело в том, что моя программа где-то выделяет (не удаляет) слишком много памяти, а ошибку я найти никак не могу.
A>С помошью new на Win32 платформе выделяеться ((size/16)+1)*16 байт, ну или поменяйте 16 на свой размер параграфа...
Полный бред...
A>С помошью delete в ЛЮБОМ СЛУЧАЕ освобождаеться столько же сколько выделенно. A>Если выделяеться и освобожаеться РАЗНОЕ количество памяти то это глюк OS :))
ОС тут совершенно не причем
A>Я бы посоветол поискать ПРОПУЩЕННЫЙ delete, варианты когда выделялось с помошью new[], а освобождалось delete и наоборот, выделялось new, а освобождалось delete[] и на ошибки в деструкторах соответственно.
Здравствуйте Алексей Данилович, Вы писали:
АД>Дело в том, что моя программа где-то выделяет (не удаляет) слишком много памяти, а ошибку я найти никак не могу.
Если дебаггер не ругается насчет утечки памяти, то скорее всего, действительно, не те delete'ы. Если поймать их никак не получается, а очень надо, можно попробовать написать класс — массив, в котором локализовать работу с выделением/освобождением памяти, и всю работу с массивами вести через него (то есть использовать new[] и delete[] только внутри этого класса). Возможно, несколько трудоемко, зато легко ошибки ловить.
Здравствуйте Алексей Данилович, Вы писали:
АД>Здравствуйте, Господа. АД>Не подскажете ли, как узнать сколько реально памяти для массива было выделено с помощью оператора new или удалено с помощью оператора delete? Если к каждому new размер можно посчитать руками, то с delete так не выйдет. Дело в том, что моя программа где-то выделяет (не удаляет) слишком много памяти, а ошибку я найти никак не могу.
. Может быть я ошибаюсь, но сравнение состояний памяти то что Вам нужно.
Suum cuique (лат.)
Re[2]: Отладка распределения памяти
От:
Аноним
Дата:
13.05.02 19:27
Оценка:
Здравствуйте Владислав, Вы писали:
В>Здравствуйте Алексей Данилович, Вы писали:
АД>>Здравствуйте, Господа. АД>>Не подскажете ли, как узнать сколько реально памяти для массива было выделено с помощью оператора new или удалено с помощью оператора delete? Если к каждому new размер можно посчитать руками, то с delete так не выйдет. Дело в том, что моя программа где-то выделяет (не удаляет) слишком много памяти, а ошибку я найти никак не могу.
В>Советую посмотреть здесь