Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Утечка памяти  (Прочитано 11476 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Petro
Гость
« : 22-04-2004 12:13 » 

Народ, подскажите пожалйуста! Я работаю со строками переменной длины. В связи с эти возникла необходимость создания класса, содержащего указатели и перегрузить некоторые операции.
class CPointer
{
private:
char* Head;   
char* Cur;
char* End;
unsigned int Count;
public:
.................
};
Хоть это и не хороший тон программирования, но в конструкторе выделяю память оператором new, в деструкторе освобождаю
CPointer::CPointer()
{
   Head = new char[0x100];
   if (!Head)
      err_mem2();
   End = Cur = Head;
   Count = 0x100;
}
CPointer::~CPointer()
{
   if (Head)
   {
      delete Head;
      End = Head = Cur = NULL;
      Count = 0;
   }
}
В перегуженных операторах, таких как ++ проверяю, хватает ли выделенной памяти, если нет, то перевыделяю большее количество
CPointer CPointer::operator ++(int)
{
CPointer Temp = *this;
DWORD offset = Cur - Head,
   nlen = End - Head;

   if ((offset + 1) >= Count)
   {
      char *T = Head;
      Head = new char[Count += 0x100];
      if (!Head)
      {
         delete T;
         err_mem3();
      }
      strncpy(Head,T,nlen + 1);
      delete T;
      Cur = Head + offset;
      End = Head + nlen;
   }

   if ((Cur + 1) > End)
      End++;

   Cur++;
   return Temp;
}
Проверяю BoundsChecker-ом и он говорит, что есть утечки памяти, причем в debug-версии он указывает на отладочную malloc, а в release указывает на вызовы HeapAlloc (посмотрел IDA по указанным адресам). Подскажите как можно определить где именно происходит утечка памяти
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 22-04-2004 13:39 » 

Petro, скажи, а BoundsChecker может показывать утечки по ф-иям, используя как ключ последовательности вызова ф-ий?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
petro
Гость
« Ответ #2 : 22-04-2004 13:59 » 

Цитата: RXL
Petro, скажи, а BoundsChecker может показывать утечки по ф-иям, используя как ключ последовательности вызова ф-ий?
да, может
Предыдущие ошибки, связанные с тем, что длина строки-получателя меньше получаемых данных были найдены и решены именно с помощью BoundsChecker-а. А сейчас он показывает, что ошибка только в _malloc_dbg и как более точно локализовать место утечки памяти, я не знаю.
Записан
Serega
Гость
« Ответ #3 : 22-04-2004 15:08 » 

А чем std::string не устраивает ?
там уж точно никаких утечек нет
Записан
Anchorite
Гость
« Ответ #4 : 22-04-2004 18:33 » 

А ты не пытался написать конструктор копии и определить оператор присваивания для своего класса?
Поскольку твой класс работает с динамичаской памятью это лучше сделать сразу во избежания лишнего гемора в дальнейшем в виде освобождения уже освобожденной памяти и попыток залезть  куда не следовало.
Записан
petro
Гость
« Ответ #5 : 22-04-2004 19:10 » 

Конструктор копирования и оператор присваивания написаны.
Записан
NetRaider
Гость
« Ответ #6 : 23-04-2004 00:14 » 

delete[] T;
delete[] Head;

Код:

Head = new char[0x100(;
if )!Head:
...


Если память выделить не удалось, должно кидаться исключение std::bad_alloc, но не все компиляторы соответствуют стандарту...
Записан
Roman123
Гость
« Ответ #7 : 23-04-2004 09:41 » 

Цитата: petro
А сейчас он показывает, что ошибка только в _malloc_dbg и как более точно локализовать место утечки памяти, я не знаю.


Я не пользуюсь Bounds Checker-ом (у меня нету версии для VS .Net 2003). Я отлавливаю утечки с помощью визуала. В окне Output после завершения програмы, crt выводит дамп всей неосвобождённой памяти. Это можна сделат и в процесе работы программы функцией _CrtDumpMemoryLeaks.

Пример того что выводиться в отладчик.
{47865} normal block at 0x01544700, 24 bytes long.
 Data: < GT  GT  GT     > 00 47 54 01 00 47 54 01 00 47 54 01 CD CD CD CD
Так вот, тут число в скобках 47865 - порядковый номер вызова выделения памяти в программе. На этот номер можна поставить точку останова функцией _CrtSetBreakAlloc.
Если порядок выделения памяти при разных запусках одинаков, то в начале программы надо вызвать _CrtSetBreakAlloc(47865) и при выделении памяти в 47865 раз сработает брейкпоинт.

А дальше по обстоятельствам Улыбаюсь
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 23-04-2004 09:53 » new

petro, но _malloc_dbg() кто-то же вызывает...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Roman123
Гость
« Ответ #9 : 23-04-2004 10:01 » 

Цитата: Petro
Я работаю со строками переменной длины. В связи с эти возникла необходимость создания класса, содержащего указатели и перегрузить некоторые операции.


Я бы рекомендовал использовать std::string или CString. Они давно написаны, проверены и удобны в эксплуатации Улыбаюсь прям рекламный лозунг получается, но кроме как в учебных целях тратить время на написание своего класа строк я не вижу смысла  Ага
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines