Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 15.06.2019
Сообщений: 1

Переполнение стека при освобождении памяти

16.06.2019, 00:35. Показов 1241. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Программа - спеллер, загружающая словарь на 143000 слов, делающая проверку правописания и освобождающая память.
Сам "словарь" сделан через префиксное дерево на основе двусвязного списка. Корень FIRST и LAST объявлены глобально.
Словарь загружается без проблем.
Вот функция на освобождение выделенной памяти:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
bool unload(void)
{
   node* current = LAST;
    
    int counter = 0;
    for (int i = 0; i < 27; i++)
     {
       if (current->next[i] != NULL)
        {          
          LAST = current->next[i];
          return unload();
        }
         else 
          {counter++;}      
     }
          
     if (counter == 27)
     {
       if (current->next[27] == NULL)
        {
         for (int i = 0; i < 28; i++)
          {
           if (FIRST->next[i] != NULL)
            {
             return false;               
            }
            else if (i == 27)
            {
             free(FIRST);
             return true;               
            }
          }
        }
      LAST = current->next[27];
      free(current);
       for (int i = 0; i < 27; i++)
       {
        if ((LAST->next[i] != NULL) && (counter2 == 0))
         {
          LAST->next[i] = NULL;
          counter2++;
         }         
 
       }
       counter2 = 0;
       return unload();  
     }
     
   
return true;      
}
Функция рекурсивна.
Если использовать словарь <35000 слов, то все идет нормально, память полностью очищается. Если словарь больше 35000, то valgrind выдает ошибку ниже, но main доходит до конца.
Если словарь больше 80000, то программа просто отлетает ошибкой сегментации. При чём valgrind каждый раз пишет, что было освобождено примерно 87,295 при словарях на 80000-143000 слов. Просьба помочь, что происходит? Я так понимаю, рекурсия заходит слишком глубоко и обрубается?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
==9497== Stack overflow in thread 1: can't grow stack to 0xbe197ffc
==9497== 
==9497== Process terminating with default action of signal 11 (SIGSEGV): dumping core
==9497==  Access not within mapped region at address 0xBE197FFC
==9497==    at 0x8048B2C: unload (load.c:170)
==9497==  If you believe this happened as a result of a stack
==9497==  overflow in your program's main thread (unlikely but
==9497==  possible), you can try to increase the size of the
==9497==  main thread stack using the --main-stacksize= flag.
==9497==  The main thread stack size used in this run was 8388608.
==9497== Stack overflow in thread 1: can't grow stack to 0xbe197ff8
==9497== 
==9497== Process terminating with default action of signal 11 (SIGSEGV)
==9497==  Access not within mapped region at address 0xBE197FF8
==9497==    at 0x4024510: _vgnU_freeres (in /usr/lib/valgrind/vgpreload_core-x86-linux.so)
==9497==  If you believe this happened as a result of a stack
==9497==  overflow in your program's main thread (unlikely but
==9497==  possible), you can try to increase the size of the
==9497==  main thread stack using the --main-stacksize= flag.
==9497==  The main thread stack size used in this run was 8388608.
==9497== 
==9497== HEAP SUMMARY:
==9497==     in use at exit: 32,352,056 bytes in 278,895 blocks
==9497==   total heap usage: 366,187 allocs, 87,292 frees, 42,477,928 bytes allocated
==9497== 
==9497== LEAK SUMMARY:
==9497==    definitely lost: 0 bytes in 0 blocks
==9497==    indirectly lost: 0 bytes in 0 blocks
==9497==      possibly lost: 0 bytes in 0 blocks
==9497==    still reachable: 32,352,056 bytes in 278,895 blocks
==9497==         suppressed: 0 bytes in 0 blocks
==9497== Reachable blocks (those to which a pointer was found) are not shown.
==9497== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==9497== 
==9497== For counts of detected and suppressed errors, rerun with: -v
==9497== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Добавлено через 1 час 26 минут
Проблема решена.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.06.2019, 00:35
Ответы с готовыми решениями:

Программа крашится при освобождении памяти
Всем привет. #include &lt;stdlib.h&gt; #include &lt;limits.h&gt; void main(void) { int qtyMAX = 2; char ***string = malloc(qtyMAX...

Ошибки при выделении (освобождении) динамической памяти
Несложная программа, реализующая алгоритмы поиска строки и подстроки в массиве строк(здесь представлен матрицей). Казалось бы, ничего...

При освобождении памяти обнуляется исходная строка
Здравствуйте! Есть функция, в ней из строки удаляются пробелы (ну и еще кое-что, не суть) путем посимвольного копирования из исходной...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.06.2019, 00:35
Помогаю со студенческими работами здесь

Стек для символов: при освобождении памяти — ошибка
(Необходимо создать стек для символов. Максимальный размер стека вводить с экрана.) 1)Что я не так организовал?(выдает только конечный...

Программа валится при освобождении памяти под динамический массив
Доброго времени суток. Проблема такая. Моя программа представляет собой поразрядную сортировку даты вида dd.mm.yyyy, пока я тестирую только...

Переполнение стека при создании трехмерного массива
Нужно создать 2 трехмерных массива: long int mas, mas2; Но при данной записи, при запуске программы выдается сообщение о переполнении...

Переполнение стека при выводе содержимого файла
Программа считывает имя файла с входного потока, отображает содержимое файла по 5 симвоов, Не пойму, из-за чего переполнение стека? ...

Переполнение стека
Ребят помогите избавиться от ошибки,вылетает в самом конце программы,программа все считает,все выводит,все верно.#include &lt;stdio.h&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значения справочника
Maks 21.03.2026
Процедура ВодителиНачалоВыбора(Элемент, ДанныеВыбора, ВыборДобавлением, СтандартнаяОбработка) / / Отключаем стандартную обработку (стандартное открытие формы выбора без фильтров) . . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru