|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
04.06.2008, 11:38 | #1 |
Регистрация: 04.06.2008
Сообщений: 4
|
утечка памяти в С++
Уважаемый олл! Помогите пожалуйста ответить на следущий вопрос:
Как в программе, написанной на С++, выявить утечку памяти? Подсказка: с помощью глобальных переменных. Заранее спасибо за помощь |
05.06.2008, 00:09 | #2 |
Регистрация: 04.06.2008
Сообщений: 7
|
Я делал так. Запускаю эту прогу и делаю в ней что-то суперактивно. А сам смотрю в Task Manager. Там количество памяти выделенной будет расти в горку при утечках. Ну или какой-нибудь LocalFree проверять. Что такое "с помощью глобальных переменных" я не понял.
|
05.06.2008, 01:33 | #3 |
...
Форумчанин
Регистрация: 01.06.2008
Сообщений: 134
|
Перегрузите операторы new/new[] и delete/delete[]. При выделении памяти глобальную переменную инкрементируйте, а при уничтожение декрементируйте (в начале программы не забудьте обнулить переменную).
|
05.06.2008, 17:50 | #4 | |
Регистрация: 04.06.2008
Сообщений: 4
|
Цитата:
А операторы new/delete нужно в каждом отдельном классе перезагружать или можно его как-то глобально перезагрузить? |
|
07.06.2008, 17:16 | #5 |
...
Форумчанин
Регистрация: 01.06.2008
Сообщений: 134
|
Можно. Пример:
Код:
Код:
|
09.06.2008, 18:36 | #6 |
Регистрация: 04.06.2008
Сообщений: 4
|
Огромное спасибо! Вы меня сильно выручили
Кстати интересно, можно ли в строчке 11 вместо "return malloc(size);" написать "return new[size];"? Последний раз редактировалось vengo; 09.06.2008 в 18:51. |
09.06.2008, 19:11 | #7 |
Форумчанин
Регистрация: 06.06.2008
Сообщений: 105
|
Хм.. Ну
malloc(size) == new[size]; лишь в том случае, когда переменная 1н байт - new[] получает кол-во элементов, под которые надо выделить |
09.06.2008, 19:20 | #8 |
Пользователь Подтвердите свой е-майл
Регистрация: 30.05.2008
Сообщений: 96
|
А не проще ли использовать _CrtDumpMemoryLeaks();
|
10.06.2008, 21:21 | #9 | ||
...
Форумчанин
Регистрация: 01.06.2008
Сообщений: 134
|
Цитата:
Цитата:
Нет, нельзя. Если вы попытаетесь так написать, то получите следующее: void* operator new[](size_t size) { count++; return new char[size]; // (1) } В месте (1) будет происходить рекурсивный вызов, который никогда не прервется из-за чего произойдет переполнение стека. В случае с оператором delete[] будет аналогичная ситуация. |
||
10.06.2008, 21:24 | #10 |
...
Форумчанин
Регистрация: 01.06.2008
Сообщений: 134
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Выделение памяти | antoha.by | Паскаль, Turbo Pascal, PascalABC.NET | 2 | 29.04.2008 20:04 |
Очистка памяти в C# | darkstarx | Общие вопросы .NET | 1 | 14.04.2008 14:48 |
игры для памяти | Exclusive | Свободное общение | 4 | 30.01.2008 23:06 |
DrawState - утечка памяти? | unnamed | Win Api | 2 | 11.04.2007 18:36 |