Отладка распределения памяти
От: Алексей Данилович  
Дата: 10.05.02 11:51
Оценка:
Здравствуйте, Господа.
Не подскажете ли, как узнать сколько реально памяти для массива было выделено с помощью оператора new или удалено с помощью оператора delete? Если к каждому new размер можно посчитать руками, то с delete так не выйдет. Дело в том, что моя программа где-то выделяет (не удаляет) слишком много памяти, а ошибку я найти никак не могу.
Re: Отладка распределения памяти
От: adontz Грузия http://adontz.wordpress.com/
Дата: 10.05.02 11:59
Оценка:
Здравствуйте Алексей Данилович, Вы писали:

АД> Дело в том, что моя программа где-то выделяет (не удаляет) слишком много памяти, а ошибку я найти никак не могу.


С помошью new на Win32 платформе выделяеться ((size/16)+1)*16 байт, ну или поменяйте 16 на свой размер параграфа...

С помошью delete в ЛЮБОМ СЛУЧАЕ освобождаеться столько же сколько выделенно.
Если выделяеться и освобожаеться РАЗНОЕ количество памяти то это глюк OS :))
Я бы посоветол поискать ПРОПУЩЕННЫЙ delete, варианты когда выделялось с помошью new[], а освобождалось delete и наоборот, выделялось new, а освобождалось delete[] и на ошибки в деструкторах соответственно.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Отладка распределения памяти
От: KA it-knowledge-base.blogspot.com
Дата: 10.05.02 13:52
Оценка:
Здравствуйте Алексей Данилович, Вы писали:

АД>Дело в том, что моя программа где-то выделяет (не удаляет) слишком много памяти, а ошибку я найти никак не могу.


А как вы это узнали?

Попробуйте 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[] и на ошибки в деструкторах соответственно.
Re: Отладка распределения памяти
От: akela  
Дата: 12.05.02 16:59
Оценка:
Здравствуйте Алексей Данилович, Вы писали:

АД>Дело в том, что моя программа где-то выделяет (не удаляет) слишком много памяти, а ошибку я найти никак не могу.


Если дебаггер не ругается насчет утечки памяти, то скорее всего, действительно, не те delete'ы. Если поймать их никак не получается, а очень надо, можно попробовать написать класс — массив, в котором локализовать работу с выделением/освобождением памяти, и всю работу с массивами вести через него (то есть использовать new[] и delete[] только внутри этого класса). Возможно, несколько трудоемко, зато легко ошибки ловить.
Re: Отладка распределения памяти
От: Владислав Россия  
Дата: 13.05.02 13:46
Оценка:
Здравствуйте Алексей Данилович, Вы писали:

АД>Здравствуйте, Господа.

АД>Не подскажете ли, как узнать сколько реально памяти для массива было выделено с помощью оператора new или удалено с помощью оператора delete? Если к каждому new размер можно посчитать руками, то с delete так не выйдет. Дело в том, что моя программа где-то выделяет (не удаляет) слишком много памяти, а ошибку я найти никак не могу.

Советую посмотреть здесь
Автор(ы): Эдвард Райт

Статья посвящена проблеме, которая постоянно преследует программистов на C/C++, — обнаружению и локализации утечек памяти. Автор демонстрирует применение средств библиотеки времени выполнения (CTR), поставляемой с Visual C++, с помощью которых утечки памяти можно устранить гораздо быстрее и проще, чем методом "пристального взгляда".
. Может быть я ошибаюсь, но сравнение состояний памяти то что Вам нужно.
Suum cuique (лат.)
Re[2]: Отладка распределения памяти
От: Аноним  
Дата: 13.05.02 19:27
Оценка:
Здравствуйте Владислав, Вы писали:

В>Здравствуйте Алексей Данилович, Вы писали:


АД>>Здравствуйте, Господа.

АД>>Не подскажете ли, как узнать сколько реально памяти для массива было выделено с помощью оператора new или удалено с помощью оператора delete? Если к каждому new размер можно посчитать руками, то с delete так не выйдет. Дело в том, что моя программа где-то выделяет (не удаляет) слишком много памяти, а ошибку я найти никак не могу.

В>Советую посмотреть здесь
Автор(ы): Эдвард Райт

Статья посвящена проблеме, которая постоянно преследует программистов на C/C++, — обнаружению и локализации утечек памяти. Автор демонстрирует применение средств библиотеки времени выполнения (CTR), поставляемой с Visual C++, с помощью которых утечки памяти можно устранить гораздо быстрее и проще, чем методом "пристального взгляда".
. Может быть я ошибаюсь, но сравнение состояний памяти то что Вам нужно.


Спасибо, Владислав!
Я, к сожалению, пишу не на VС++, а на BC++B, но все равно, это уже хоть что-то! Первый ответ по теме вопроса!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.