Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2008, 11:38   #1
vengo
 
Регистрация: 04.06.2008
Сообщений: 4
По умолчанию утечка памяти в С++

Уважаемый олл! Помогите пожалуйста ответить на следущий вопрос:
Как в программе, написанной на С++, выявить утечку памяти?
Подсказка: с помощью глобальных переменных.
Заранее спасибо за помощь
vengo вне форума Ответить с цитированием
Старый 05.06.2008, 00:09   #2
Jolyk
 
Регистрация: 04.06.2008
Сообщений: 7
По умолчанию

Я делал так. Запускаю эту прогу и делаю в ней что-то суперактивно. А сам смотрю в Task Manager. Там количество памяти выделенной будет расти в горку при утечках. Ну или какой-нибудь LocalFree проверять. Что такое "с помощью глобальных переменных" я не понял.
Jolyk вне форума Ответить с цитированием
Старый 05.06.2008, 01:33   #3
filosof_x86
...
Форумчанин
 
Аватар для filosof_x86
 
Регистрация: 01.06.2008
Сообщений: 134
По умолчанию

Перегрузите операторы new/new[] и delete/delete[]. При выделении памяти глобальную переменную инкрементируйте, а при уничтожение декрементируйте (в начале программы не забудьте обнулить переменную).
filosof_x86 вне форума Ответить с цитированием
Старый 05.06.2008, 17:50   #4
vengo
 
Регистрация: 04.06.2008
Сообщений: 4
По умолчанию

Цитата:
Сообщение от filosof_x86 Посмотреть сообщение
Перегрузите операторы new/new[] и delete/delete[]. При выделении памяти глобальную переменную инкрементируйте, а при уничтожение декрементируйте (в начале программы не забудьте обнулить переменную).
Спасибо за ответ! Именно это мне и было нужно.
А операторы new/delete нужно в каждом отдельном классе перезагружать или можно его как-то глобально перезагрузить?
vengo вне форума Ответить с цитированием
Старый 07.06.2008, 17:16   #5
filosof_x86
...
Форумчанин
 
Аватар для filosof_x86
 
Регистрация: 01.06.2008
Сообщений: 134
По умолчанию

Можно. Пример:

Код:
#include <iostream>

int count;
void InitCount() {count = 0;}
void PrintCount() {std::cout << "non free: " << count << std::endl;}

void* operator new[](size_t size)
{
  count++;
  return malloc(size);
}

void operator delete[](void *p)
{
  count--;
  free(p);
}

class A {
public:
  A() {std::cout << "constructor" << std::endl;}
  ~A() {std::cout << "destructor" << std::endl;}
};

int main()
{
  InitCount();
  A *p = new A[2];
  PrintCount();
  delete [] p;
  PrintCount();
  return 0;
}
Вывод:
Код:
constructor
constructor
non free: 1
destructor
destructor
non free: 0
filosof_x86 вне форума Ответить с цитированием
Старый 09.06.2008, 18:36   #6
vengo
 
Регистрация: 04.06.2008
Сообщений: 4
По умолчанию

Огромное спасибо! Вы меня сильно выручили
Кстати интересно, можно ли в строчке 11 вместо "return malloc(size);" написать
"return new[size];"?

Последний раз редактировалось vengo; 09.06.2008 в 18:51.
vengo вне форума Ответить с цитированием
Старый 09.06.2008, 19:11   #7
Olympian
Форумчанин
 
Аватар для Olympian
 
Регистрация: 06.06.2008
Сообщений: 105
По умолчанию

Хм.. Ну
malloc(size) == new[size];
лишь в том случае, когда переменная 1н байт - new[] получает кол-во элементов, под которые надо выделить
Olympian вне форума Ответить с цитированием
Старый 09.06.2008, 19:20   #8
Игорь007
Пользователь Подтвердите свой е-майл
 
Аватар для Игорь007
 
Регистрация: 30.05.2008
Сообщений: 96
По умолчанию

А не проще ли использовать _CrtDumpMemoryLeaks();
Игорь007 вне форума Ответить с цитированием
Старый 10.06.2008, 21:21   #9
filosof_x86
...
Форумчанин
 
Аватар для filosof_x86
 
Регистрация: 01.06.2008
Сообщений: 134
По умолчанию

Цитата:
Сообщение от vengo Посмотреть сообщение
Кстати интересно, можно ли в строчке 11 вместо "return malloc(size);" написать "return new[size];"?
Цитата:
Сообщение от Olympian Посмотреть сообщение
Хм.. Ну
malloc(size) == new[size];
лишь в том случае, когда переменная 1н байт - new[] получает кол-во элементов, под которые надо выделить

Нет, нельзя. Если вы попытаетесь так написать, то получите следующее:
void* operator new[](size_t size)
{
count++;
return new char[size]; // (1)
}

В месте (1) будет происходить рекурсивный вызов, который никогда не прервется из-за чего произойдет переполнение стека. В случае с оператором delete[] будет аналогичная ситуация.
filosof_x86 вне форума Ответить с цитированием
Старый 10.06.2008, 21:24   #10
filosof_x86
...
Форумчанин
 
Аватар для filosof_x86
 
Регистрация: 01.06.2008
Сообщений: 134
По умолчанию

Цитата:
Сообщение от Игорь007 Посмотреть сообщение
А не проще ли использовать _CrtDumpMemoryLeaks();
Это только под VC++
filosof_x86 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выделение памяти 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