Форум программистов, компьютерный форум, киберфорум
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. Показов 10999. Ответов 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
270 / 202 / 30
Регистрация: 26.11.2022
Сообщений: 879
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
270 / 202 / 30
Регистрация: 26.11.2022
Сообщений: 879
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
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
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
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
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
270 / 202 / 30
Регистрация: 26.11.2022
Сообщений: 879
25.01.2025, 21:57
Стилистические различия скорее всего из за того что в разное время писали запросы в чат гпт.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,306
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
270 / 202 / 30
Регистрация: 26.11.2022
Сообщений: 879
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
Ответ Создать тему
Новые блоги и статьи
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru