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

Большой массив данных и segfault

14.12.2013, 09:55. Показов 1561. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть струтура ( порядка 4 uint32_t + 8 байт char )
Нужно хранить 32000 таких структур постоянно
Если выделять память на куче ( т.е. хранить в массиве указатели, а память под струтуры выделять динамически через new) , то все ОК.
Если же резервировать память сразу - то при запуске падает в кору. Т.е, если написать -
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typedef struct data_tag {
    uint32_t p1;
    uint32_t p2;
    uint32_t p3;
    uint32_t p4;
    uint8_t p5[8];
} data_t;
 
class Test {
public:
    Test();
     virtual ~Test();
 
     data_t array[32000];
};
То код компилиться, прога запускается, но вылетает (каждый раз в разных местах) практически сразу и чаще всего на конструкторе овнера класса Test
Gdb говорит что не может показать фрэймы
99.9% проблема в том что, "закусываем" память, но как "вылечить" что бы можно было сделать масив структур а не укзалок? Опции компиляции? Опции запуска (limit какиенибудь?)

Тоже самое написаное на чистом с и скомпиленное на gcc 3.14 - все работает.

Компилирую g++ версии 4.4.2 под 64 разрядный Linux

Добавлено через 42 минуты
Смотреть в сторону setrlimit?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.12.2013, 09:55
Ответы с готовыми решениями:

Скопировать большой объём данных
Имеются два txt-файла почти по 100К строк (каждый порядка 3 МБ весит). Нужно "скрестить" эти файлы, подставляя по очереди строки из...

как разместить большой массив данных ?
всех поздравляю с новым годом !!! Подскажите как в STM8S разместить массив данных который превышает 1к байт (шрифты для дисплея) так...

Как отрисовать большой массив данных
Вобщем столкнулся с проблемой: нужно отрисовать большой массив (2000*8000 точек) из файла. Он конечно отрисовывается, но тратится на это 55...

10
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
14.12.2013, 10:21
Самое правильное в данном случае - выделять память динамически - стек не резиновый.
ulimit -s <stack_size, kbytes>, но я этого не говорил.
0
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 3
14.12.2013, 14:14  [ТС]
Есть опции компиляции, которые проверяли бы что возможно будет "закусывание" стэка?
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
14.12.2013, 15:03
Ответ в самом вопросе: на этапе компиляции нет информации о том, в каком окружении будет выполняться программа.
Чем не устраивает динамический массив?
0
0 / 0 / 0
Регистрация: 14.12.2013
Сообщений: 3
14.12.2013, 22:15  [ТС]
Динамикой и сделал - все прекрасно работает... Удивило само поведение - запросил на стэке памяти больше чем тебе могут дать - и трындец - корка готова. И проблема решилась не сразу. А если у заказчика через тот же ulimit выставят на байт меньше чем проге нужно и ищи потом проблему )
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
15.12.2013, 07:12
Цитата Сообщение от sccp Посмотреть сообщение
Удивило само поведение - запросил на стэке памяти больше чем тебе могут дать - и трындец - корка готова.
А как еще поступать? При запуске процесса ему отводится некоторый объем памяти. Если он махом просит больше - все плохо. Другое дело, что по мере продвижения указателя стека, ОС может постепенно увеличивать его размер во время выполнения.
0
835 / 643 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
19.12.2013, 13:59
А почему бы не создать глобальный объект Test'а? Или наоборот через new? Чтобы он не в стеке оказался.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
19.12.2013, 15:06
Цитата Сообщение от Qwertiy Посмотреть сообщение
А почему бы не создать глобальный объект Test'а?
Потому что не надо нам глобальных объектов.
А про динамическое выделение автор сам уже отписался.
0
19.12.2013, 17:50

Не по теме:

Цитата Сообщение от 0x10 Посмотреть сообщение
Потому что не надо нам глобальных объектов.
Гениальный подход - подавимся, но глобальные объекты использовать не будем.

0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
19.12.2013, 18:27
Цитата Сообщение от Qwertiy Посмотреть сообщение
Гениальный подход - подавимся, но глобальные объекты использовать не будем.
Тут нечем давиться, все просто решается.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
19.12.2013, 18:47
Цитата Сообщение от sccp Посмотреть сообщение
Есть опции компиляции, которые проверяли бы что возможно будет "закусывание" стэка?
Почему вылетает программа?

Добавлено через 44 секунды
Опция -mstack-arg-probe у gcc под intel, но ту тему для самообразования можно и почитать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.12.2013, 18:47
Помогаю со студенческими работами здесь

Создать макрос который будет транспонировать данные из столбца по колонкам (большой массив данных)
Вообщем суть проблемы: имеется БД, состоящая из названия, адреса,телефона. Это БД записана в 1 столбец, а данные расположены поочередно, то...

Как можно в памяти уместить больше данных ?Большой массив или список маленьких массивов ?
сабж выше

GC+SEGFAULT
Всем трям. Вопрос продвинутым. Посещаю курсы по Питону и задали нам хитрое задание - сделать так, чтобы питоновский процесс грохнулся...

Segfault at 0 .error
1. Debian 8 64bit 2. Все, что нашла lib32 загружены 3. Гугл не помог Та же сборка стояла на Fedora 12. Из-за смены жесткого...

Segfault на ровном месте
Доброго времени суток. Пишу достаточно простую программку под Linux. Вот кусок кода в котором вылазит ошибка сегментации: void...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru