Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Повреждение кучи 
V
    Опции темы
Enelar
Дата 15.10.2009, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 13.1.2008

Репутация: нет
Всего: 1



пишу хаффмана, в чем ошибка?
Код

/* Burn tree function
 * ARGUMENTS:
 *    - pointer to tree root
 * RETURNS: None.
 */
void BurnTree( BTREE *tree )
{
  if (tree == NULL)
    return;
  if ((tree)->ChL != NULL)
    BurnTree(((tree)->ChL));
  if ((tree)->ChR != NULL)
    BurnTree(((tree)->ChR));
  free(tree);
} /* End of 'BurnTree' function */

/* Grow tree function
 * ARGUMENTS:
 *    - pointer to root of tree
 *      (BTREE *)tree
 *    - occurancy
 *      (ULONG) occ
 *    - freq..
 *      (float) freq
 * RETURNS:
 *   (int) 0 on success, 1 overwise
 */
int GrowTree( BTREE **tree, ULONG occ, float freq )
{
  BTREE *newtr = (BTREE *)malloc(sizeof(tree)), *temp = *tree;

  if (newtr == NULL)
    return 1;
  newtr->Freq = freq;
  newtr->Occurrence = occ;
  newtr->ChL = NULL;
  newtr->ChR = NULL;

  if (*tree == NULL)
    *tree = newtr;
  else
  {
    while (THE_WORLD_EXISTS) /* Search top */
      if (temp->Occurrence < occ)
        if (temp->ChR == NULL)
          break;
        else
          temp = temp->ChR;
      else
        if (temp->ChL == NULL)
          break;
        else
          temp = temp->ChL;
    /* Add in top */
    if (temp->Occurrence < occ)
      temp->ChL = newtr;
    else
      temp->ChR = newtr;
  }
  return 0;
} /* End of 'GrowTree' function */

/* Create forest in emptiness function
 * ARGUMENTS:
 *    - pointer to occurrence array
 *      (long *)occurence
 *    - pointer to frequency array
 *      (float *)freq
 *    - pointer to array with forest
 *      (BTREE **)forest
 * RETURNS:
 *   (int) 0 on success, 1 overwise
 */
int GrowForest( ULONG *oc, float *freq, BTREE **forest )
{
  int i;

  for (i = 0; i < 256; i++)
  {
    forest[i] = NULL;
    if (GrowTree(&forest[i], oc[i], freq[i]))
       break;
  }
  if (i != 256)
  {
    for (; i > 0; i--)
      BurnTree(forest[i]);
    return 1;
  }
  return 0;
} /* End of 'GrowForest' function */

/* Budding two trees function
 * ARGUMETNS:
 *    - pointer to trees
 *      (BTREE *, BTREE *) a, b
 * RETURNS:
 *   (int) 0 on success, 1 overwise
 */
int BuddingTrees( BTREE **a, BTREE **b )
{
  if ((*b)->ChL != NULL)
    if (BuddingTrees(a, &((*b)->ChL)))
      return 1;
  if ((*b)->ChR != NULL)
    if (BuddingTrees(a, &((*b)->ChR)))
      return 1;
  if (GrowTree(a, (*b)->Occurrence, (*b)->Freq))
    return 1;
  free(*b);
//  BurnTree(b);
  return 0;
} /* End of 'BuddingTrees' function */

/* Build huffman tree function
 * ARGUMENTS:
 *    - pointer to occurrence array
 *      (long *)occurence
 *    - pointer to frequency array
 *      (float *)freq
 *    - pointer to result huffman tree
 *      (BTREE *) res
 * RETURNS:
 *   (int) 0 on success, 1 overwise
 */
int BuildHuffmanTree( ULONG *occurrence, float *freq, BTREE *res )
{
  BTREE *forest[256];
  int i, count = 256, min, min2;
  ULONG otarget = 0;

  /* If no place in the world to grow a forest */
  if (GrowForest(occurrence, freq, forest))
    return 1;
  for (i = 0; i < 256; i++)
    otarget += occurrence[i];
  while (THE_WORLD_EXISTS)
  {
    SortForest(forest, count);
    if (forest[0]->Occurrence == otarget)
      break;
    for (min = i = 0; i < 256; i++)
      if (forest[min]->Freq > forest[i]->Freq)
        min = i;
    for (min2 = i = 0; i < 256; i++)
      if ((forest[min2]->Freq > forest[i]->Freq) && i != min)
        min2 = i;

    if (BuddingTrees(&forest[min], &forest[min2]))
      return 1;
    count--;
  }

  return 0;
} /* End of 'BuildHuffmanTree' function */

В функции Budding trees в free повреждение кучи происходит.
PM MAIL   Вверх
zim22
Дата 15.10.2009, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Enelar @  15.10.2009,  18:28 Найти цитируемый пост)
пишу хаффмана, в чем ошибка?

проверь указатели, индексы массива, преобразования, возвращаемые значения. ошибка в них.


--------------------
PM MAIL   Вверх
Alexeis
Дата 15.10.2009, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Можно перегрузить оператор new глобально и определить номер выделения памяти который при удалении падает, затем при выделении этого же блока во второй раз записать адрес где было выделено, затем включить окно просмотра памяти и идти дебагом. В определенный момент память должна потереться и это будет отмеченно красным. Вот эта строчка и будет вредной. Ошибка скорее всего переход за границу массива.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Enelar
Дата 15.10.2009, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 13.1.2008

Репутация: нет
Всего: 1



Цитата(zim22 @  15.10.2009,  18:32 Найти цитируемый пост)
проверь указатели, индексы массива, преобразования, возвращаемые значения. ошибка в них.


Цитата(Alexeis @  15.10.2009,  19:14 Найти цитируемый пост)
Ошибка скорее всего переход за границу массива.


эх, ребята если бы... я бы не обращался. Указатель приходит валидный, в массиве, с нормальными данными.
Выдает ошибку даже если делать
Код

if (BuddingTrees(&forest[1], &forest[0]))
      return 1;

массив точно создается.
проблема именно при вызове функции, тк вне нее все классно очищается.
PM MAIL   Вверх
Alexeis
Дата 15.10.2009, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Цитата(Enelar @  15.10.2009,  17:28 Найти цитируемый пост)
В функции Budding trees в free повреждение кучи происходит. 

  Неверный вывод. Там происходит определение того что куча навернулась. Немного пояснения. В дебаге память выделяется с запасом. До и после блока данных пишут сигнатуры. После выделения памяти сигнатуры на месте. Перед освобождением памяти сигнатуры проверяются. Если был выход за границу то сигнатура портится и отладка аварийно завершается. Так что указанная функция не имеет ничего общего с процессом порчи кучи. Она может портиться в любом месте программы. Следует определить сначала какая именно это переменная, затем поставить брейки везде где ее меняют, затем под дебагом смотреть память выше и ниже блока. В момент порчи там изменятся данные и "враг будет найден".


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Enelar
Дата 15.10.2009, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 13.1.2008

Репутация: нет
Всего: 1



Цитата(Alexeis @  15.10.2009,  23:01 Найти цитируемый пост)
затем под дебагом смотреть память выше и ниже блока

что то новое для меня... просто передвинуть указатель чуть раньше?
Цитата(Alexeis @  15.10.2009,  23:01 Найти цитируемый пост)
Неверный вывод. Там происходит определение того что куча навернулась. 

хорошо, почему когда я пишу
Код

int BuildHuffmanTree( ULONG *occurrence, float *freq, BTREE *res )
{
  BTREE *forest[256];
  int i, count = 256, min, min2;
  ULONG otarget = 0;

  /* If no place in the world to grow a forest */
  if (GrowForest(occurrence, freq, forest))
    return 1;
  free(forest[0]);
  return 0;
} /* End of 'BuildHuffmanTree' function */

все работает, а когда
Код

int BuddingTrees( BTREE **a, BTREE **b )
{
  free(*b);
  return 0;
} /* End of 'BuddingTrees' function */

int BuildHuffmanTree( ULONG *occurrence, float *freq, BTREE *res )
{
  BTREE *forest[256];
  int i, count = 256, min, min2;
  ULONG otarget = 0;

  /* If no place in the world to grow a forest */
  if (GrowForest(occurrence, freq, forest))
    return 1;
    if (BuddingTrees(&forest[1], &forest[0]))
      return 1;

  return 0;
} /* End of 'BuildHuffmanTree' function */

все плохо. как видно я не изменяю переменную, а проблема в передаче
PM MAIL   Вверх
Alexeis
Дата 16.10.2009, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Цитата(Enelar @  15.10.2009,  22:48 Найти цитируемый пост)
что то новое для меня... просто передвинуть указатель чуть раньше?

  Окно просмотра памяти. Переходишь по адресу и смотришь прямо дамп памяти как есть. 

Цитата(Enelar @  15.10.2009,  22:48 Найти цитируемый пост)
хорошо, почему когда я пишу

трудно по фрагментам что-то судить. Такие ошибки одни из самых трудноуловимых. Могут вредить в любом месте, а всплывать в совершенно другом. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
bsa
Дата 19.10.2009, 16:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Код
int BuddingTrees( BTREE **a, BTREE **b )
{
  free(*b);
  return 0;
} /* End of 'BuddingTrees' function */
а где *b = NULL? Может ты просто два раза удаляешь одну и туже переменную?
PM   Вверх
Enelar
Дата 11.11.2009, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 141
Регистрация: 13.1.2008

Репутация: нет
Всего: 1



ошибка вылетала при первом фри решение нашел сам, отписаться забыл
Код

void a( void )
{
  int a[293];

  free(a+30);
}

Вот такой был код))
PM MAIL   Вверх
bsa
Дата 11.11.2009, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196




M
bsa
Enelar, если ответ на вопрос получен, то пометь тему решенной

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1687 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.