Форум программистов, компьютерный форум, киберфорум
C (Си)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.86/14: Рейтинг темы: голосов - 14, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 24.02.2021
Сообщений: 18

Ошибка Fatal glibc error: malloc.c:2599

04.01.2025, 20:16. Показов 11312. Ответов 34

Студворк — интернет-сервис помощи студентам
При компиляции ошибок нет.

При запуске в середине программы ошибка.
Code
1
Fatal glibc error: malloc.c:2599 (sysmalloc): assertion failed: (old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)
Нашел причину, но не могу до конца понять как устранить.

Открываю файл config (текстовый), в нем настройки программы. С новой строки (переменная = значение). Есть в конфиге следующая строка:
prefix_mobile = m

При наличии строки ошибок нет, но переменная в которую я копирую значение оказывается пустая. Когда строку из конфига убираю - происходит ошибка (выше).

1. Почему переменная char * prefix_mobile пустая, когда я копирую туда значение. Она не пустая сразу. Я делал вывод в консоль через printf и она выводится правильно. Ниже через строк 300-400 кода я вывожу эту переменную и она пустая.

2. Почему когда я убираю эту строку из конфига происходит ошибка (выше).

Много информации нашел в интернете, в т.ч. про valgrind утилиту для тестирования. Могу переписать код программы по новой и посмотреть что выйдет, но уйдет много времени.

3. Читал статью в интернете. Про выделение памяти malloc. Есть информация что выделенная память растет в геометрической прогресиии, даже если передаю в malloc 9 байтов, то она округляется до 8 * 2 = 16. Если передаю malloc 129 (128 + 1), то память округляется до 256 (128 * 2). Это миф или есть основа для таких выводов? Может есть другое объяснение этой информации?


Есть альтернативные библиотеки для управление памятью?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.01.2025, 20:16
Ответы с готовыми решениями:

Ошибка при компиляции [Linker Fatal Error] Fatal: Expected a file name:
При компеляции Выдает Fatal: Expected a file name:

Ошибка [Linker Fatal Error] Fatal: Unable to Open file 'VCL.LI'
Прошу помощи: при попытке компиляции проекта возникает ошибка Fatal: Unable to Open file 'VCL.LI'. Builder пытается найти этот файл, но...

Ошибка [Linker Fatal Error] Fatal: Expected a file name:
При запуске любой программы пишет ошибку:-| Скоро курсовую сдавать,а я ее сделать не могу:cry: пишет ошибку: Fatal: Expected a file...

34
274 / 206 / 30
Регистрация: 26.11.2022
Сообщений: 897
08.01.2025, 00:08
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от davidzhuchkov Посмотреть сообщение
Я закомментировал код, где появлялась ошибка, и ошибка перешла в другой участок программы(
потому что где-то в другом месте вашей программы портится метаинформация о блоках памяти. Это обычное дело. Если что где-то что-то испортилось в информации о блоках памяти (где-то в своей программе вы записали за пределы выделенного блока пямяти - а там уже находится служебная информация malloc) это может вылезти где угодно в программе, а может и не вылезти до конца работы. В этом и трудность отладки таких ошибок.

Цитата Сообщение от davidzhuchkov Посмотреть сообщение
Вообще в учебниках, которые я читал - рекомендуется сразу выделать память для программы а потом ее запускать. с запасом. так и сделаю.
Этот способ предназначен для решения других проблем. В этом случае вы должны либо особым образом программировать и работать с ресурсами или сами реализовать аллокатор внутри этого блока пямяти.

мне вот совершенно непонятно почему вы не хотите выяснить где ваша программа выходит за размер выделенного блока памяти.
делаете отладочную обёртку, подписываете до и после блока и всё. единственная модификация существующего кода - добавляется ещё один заголовочный файл.
0
0 / 0 / 0
Регистрация: 24.02.2021
Сообщений: 18
10.01.2025, 01:12  [ТС]
Ошибка была в аллокаторе malloc.h

решил так:
1. библиотеку <unistd.h> не отключал
2. с репозитория github (nasrat-v/malloc) скопировал себе все функции в начало файла.

ошибка исчезла. в чем проблема неизвестно.
0
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
14.01.2025, 23:10
Цитата Сообщение от davidzhuchkov Посмотреть сообщение
Ошибка была в аллокаторе malloc.h
Слушай, брат. Я 30 лет программирую и каждый раз, когда такое слышал, оказывался виноват автор, а не библиотечный код.
Не думаю, что щас как-то подругому.
То, что ты ошибку у себя не нашел, а валить стал на библиотечный код - это понятная реакция, но вот то, что ты на этом остановился и копать не стал, чтоб истину узнать, говорит о тебе многое и не в самом лучшем свете.
1
0 / 0 / 0
Регистрация: 24.02.2021
Сообщений: 18
18.01.2025, 10:34  [ТС]
ablex, ты видел исходный код библиотеки malloc? вот посмотри сначала а потом делай выводы
0
274 / 206 / 30
Регистрация: 26.11.2022
Сообщений: 897
18.01.2025, 11:29
Цитата Сообщение от davidzhuchkov Посмотреть сообщение
исходный код библиотеки malloc
и сколько реалищаций вы видели ? одну или две?
Этих реализаций сотни и постоянно выходят новые и улучшенные версии.

потрогать вершину айсберга - тут https://habr.com/ru/articles/645137/

любой аллокатор памяти это очень стабильный код, который всячески тестируется.
если у вас срабатывает assert внутри аллокатора то 99,999 % - это ошибка а вашем коде.
Это ваш код попортил внутренние данные аллокатора.
0
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
18.01.2025, 16:57
davidzhuchkov, Ищи ошибку в своём коде.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13214 / 6847 / 1825
Регистрация: 18.10.2014
Сообщений: 17,332
19.01.2025, 06:35
Цитата Сообщение от davidzhuchkov Посмотреть сообщение
Ошибка была в аллокаторе malloc.h

решил так:
1. библиотеку <unistd.h> не отключал
2. с репозитория github (nasrat-v/malloc) скопировал себе все функции в начало файла.

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

P.S. В языке С нет никакого "аллокатора malloc.h".

Добавлено через 4 минуты
Цитата Сообщение от davidzhuchkov Посмотреть сообщение
C
1
2
3
    memset(&g.useragent_masks_desktop[ g.useragent_masks_desktop_count ][0], 0, main_data.uli4);
// cpy
    strcpy(g.useragent_masks_desktop[ g.useragent_masks_desktop_count ], main_data.char2);
Кто вообще писал этот необычный код? Почему получение указателя на начало массива для memset делается как &g.useragent_masks_desktop[ g.useragent_masks_desktop_count ][0], а для strcpy - как g.useragent_masks_desktop[ g.useragent_masks_desktop_count ]. Да, это одно и то же, но почему вдруг такие два стилистически разных подхода использованы в соседних строчках кода? Разные люди писали?

Это не говоря уже о полнейшей бессмысленности данного memset.
0
0 / 0 / 0
Регистрация: 24.02.2021
Сообщений: 18
25.01.2025, 13:29  [ТС]
TheCalligrapher, проблема была не в memset точно, потому-что функции выполняются поочередно. просто уходило больше времени.
Вообще библиотека malloc.h существует. Идет вместе с библиотекой unistd.h. также можно скачать и подключить отдельно.
Проблема была в REALLOC , потому что он портил данные при перераспределении памяти. Вообще нужно выделать память сразу, и рассчитывать это перед запуском основного кода.
Допустим зная что максимальная длина 1000 в 2д массиве. можно выделить сразу память для указателей написав:
C
1
char ** array_chars = (char **) malloc(1000 * sizeof(void *));
а даже если программа не достигнет 700 ключей, память будет выделена для 1000 ключей и не придется перераспределять память. Что приводит и к скорости и память не портится. Вообще есть информация что функции sbrk и brk будут портить память. поэтому в качестве альтернативы можно использовать вызов mmap так:

C
1
2
3
4
5
g->mem_ptr = mmap(NULL, g->mem_all, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if(g->mem_ptr == MAP_FAILED){
    printf("Error: mmap [mem_ptr]\n");
    goto main_memfree;
}
и освободить память так:

C
1
munmap(g->mem_ptr, g->mem_all);
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13214 / 6847 / 1825
Регистрация: 18.10.2014
Сообщений: 17,332
25.01.2025, 17:13
Цитата Сообщение от davidzhuchkov Посмотреть сообщение
проблема была не в memset точно, потому-что функции выполняются поочередно. просто уходило больше времени.
А при чем здесь это? Никто и не говорил, что с memset есть какие-то проблемы. Вопрос был лишь о внезапных стилистических странностях кода.

Цитата Сообщение от davidzhuchkov Посмотреть сообщение
Вообще библиотека malloc.h существует. Идет вместе с библиотекой unistd.h. также можно скачать и подключить отдельно.
??? Того, что "можно скачать и подключить отдельно" существует очень много разного. Это ничего не значит.

В языке же С никакой "библиотеки malloc.h" не существует.

Цитата Сообщение от davidzhuchkov Посмотреть сообщение
Проблема была в REALLOC , потому что он портил данные при перераспределении памяти. Вообще нужно выделать память сразу, и рассчитывать это перед запуском основного кода.
Что такое REALLOC и где вы до этого момента упоминали этот REALLOC в своих вопросах или приводили код с этим REALLOC?

Цитата Сообщение от davidzhuchkov Посмотреть сообщение
Допустим зная что максимальная длина 1000 в 2д массиве. можно выделить сразу память для указателей написав:
C
1
char ** array_chars = (char **) malloc(1000 * sizeof(void *));
а даже если программа не достигнет 700 ключей, память будет выделена для 1000 ключей и не придется перераспределять память. Что приводит и к скорости и память не портится.
... но приводит в перерасходу памяти. В любом случае, это все замечательно, но к чему вы здесь это все рассказываете?

Цитата Сообщение от davidzhuchkov Посмотреть сообщение
Вообще есть информация что функции sbrk и brk будут портить память.
!!! "Есть информация"...

Кстати, а что такое "портить память"?

Цитата Сообщение от davidzhuchkov Посмотреть сообщение
поэтому в качестве альтернативы
Альтернативы чему именно?

Цитата Сообщение от davidzhuchkov Посмотреть сообщение
можно использовать вызов mmap так:

C
1
2
3
4
5
g->mem_ptr = mmap(NULL, g->mem_all, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if(g->mem_ptr == MAP_FAILED){
    printf("Error: mmap [mem_ptr]\n");
    goto main_memfree;
}
Опять какой-то стилистический салат пошел... Почему у вас в примере выше к результату malloc применен явный каст, а здесь к результату mmap каст не применяется. В чем логика выбора, когда применять каст, а когда не применять?
0
0 / 0 / 0
Регистрация: 24.02.2021
Сообщений: 18
25.01.2025, 20:00  [ТС]
TheCalligrapher, да мне эта критика никуда не уперлась.
за пределы памяти не выхожу. realloc выдает ошибку Fatal glibc error: malloc.c:2599.
если нет решения - досвидание. покиньте тему.

на указатели первого уровня уходит 4гб из 48 гб. так если жалко купить 4 планки ОЗУ по 16 гб, и проводить тесты. а мне они именно для тестов нужны. то это ваше дело.
сколько озу жрет mysql? она вообще выделает по 65к байт на текст и куда там 10к символов писать а остается сколько?
в оптимизации вы профан!

Добавлено через 5 минут
TheCalligrapher, у тебя Сообщений: 16,928 на форуме, а ты логику выбора не понимаешь.
ты вообще программист?
0
0 / 0 / 0
Регистрация: 24.02.2021
Сообщений: 18
25.01.2025, 20:32  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
В чем логика выбора, когда применять каст, а когда не применять?
это решение, а каст сам поставишь

Добавлено через 16 минут
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Альтернативы чему именно?
sbrk , brk, malloc
0
274 / 206 / 30
Регистрация: 26.11.2022
Сообщений: 897
25.01.2025, 21:57
Стилистические различия скорее всего из за того что в разное время писали запросы в чат гпт.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13214 / 6847 / 1825
Регистрация: 18.10.2014
Сообщений: 17,332
25.01.2025, 22:18
Цитата Сообщение от Aledveu Посмотреть сообщение
Стилистические различия скорее всего из за того что в разное время писали запросы в чат гпт.
У меня другое объяснение по этому поводу, ибо это явление наблюдалось задолго до появления всяких "чатов гопотэ".

У многих "пионэров" из-за некачественных примеров в книге K&R прямо в мозх прошит карго-культ кастования результата malloc. То есть пресловутой "лампочкой Павлова", вызывающей выделение ненужных кастов, является именно эта последовательность букв - "malloc". Иные буквосочетания (mmap, sbrk...) такого рефлекса обильного кастовыделения не вызывают, по каковой причине для этих функций каст не делается.

Доходит иногда даже до такого абсурда (который мы не раз встречали и здесь), когда "пионэр" остервенело кастует все результаты malloc, но в то же время религиозно избегает кастов на расположенные рядом же realloc. Попытки выяснить причины такого поведения как правило повергают испытуемого в состояние ступора с беспорядочным морганием остекленевшими глазами и нечленораздельным бэканьем и мэканьем.
0
0 / 0 / 0
Регистрация: 24.02.2021
Сообщений: 18
28.01.2025, 15:11  [ТС]
TheCalligrapher, кастом это что? то что не входит в стандартные библиотеки? ну тогда вы знаете что они бесплатные потому что это свободное ПО. Никто там сильно не старался, написано было 1 раз и без исправления ошибок, а только потом выходят стандарты, которые исправляют ошибки.

Есть и другие аллокаторы RAM.


Некоторые аллокаторы памяти в Си:

dlmalloc (расшифровывается Doug Lea malloc); 2
ptmalloc2 (расшифровывается pthreads malloc) — форк предыдущего, используется в glibc; 2
jemalloc — используется в FreeBSD и Firefox; 2
tcmalloc — от Google; 2
аллокатор MSVC, использующий WinAPI-функции HeapAlloc/HeapFree.

malloc почему то, создатели этих аллокаторов, использовать не стали.

Добавлено через 2 минуты
TheCalligrapher, сам рот открываешь. хочешь сказать что у тебя была такая ошибка и ты ее исправил? или ты просто комментируешь сам не зная что
0
274 / 206 / 30
Регистрация: 26.11.2022
Сообщений: 897
28.01.2025, 16:21
davidzhuchkov, Вам сказали что сделать - включите (временно для отладки) в свой проект библиотеку отслеживания повреждений в памяти и выясните в какой момент портится.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.01.2025, 16:21

Ошибка при компилировании проекта. [Linker Fatal Error] Fatal: Unable to open file '*.OBJ'
Ребят, при компилировании проекта вылезает ошибка Fatal: Unable to open file 'ACPNG.OBJ' P.S. исходник проекта был куплен, а...

[Linker Fatal Error] Fatal: Could not open ~CBuilder6\Projects\Project1.exe (error code 5)
Инсталировал с++ builder 6. Запустил програму и попробывал компилировать пустую форму, чтобы протестировать програму. Она должна была мне...

Error C2760: синтаксическая ошибка / Fatal error C1004: непредвиденное обнаружение конца файла
Набыдлокодил следующее: Graph.h template&lt;class D&gt; class Graph { private: class Edge { private: int v1, v2;

Ошибка сборки "[Linker Fatal Error] Fatal: Expected a file name"
Выдаёт ошибку: Fatal: Expected a file name Пробовал настроить через Directories/Conditionals, не помогло. Код программы: ...

ошибка fatal error
при запуске exe вылетает ошибка что переменная i не инициализированна. #include &lt;iostream&gt; //using namespace std; ...


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru