Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2015, 13:10   #1
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
Вопрос Прострел памяти

Здравствуйте.

Использую большое количество операций new delete, в общем программа работает (с небольшим количеством объектов), но при увеличении количества объектов (классов) с которыми работает программа, происходит segmentation fault. Проблема в простреле памяти как мне подсказали.

Если я полностью заменю new delete на std::vector поможет ли мне это?
gunsoy вне форума Ответить с цитированием
Старый 12.07.2015, 13:39   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А ты хоть спросил что это означает?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.07.2015, 14:28   #3
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
По умолчанию

Тут прочитал
http://stackoverflow.com/questions/1...a-memory-stomp

В общем одни данные перекрывают другие данные. В моём случае простреливает тот участок памяти где находиться код. Например

Код:
void Map::Load()
{
    .....
}
Отладчик указывает что проблема на второй строке, то есть на {
gunsoy вне форума Ответить с цитированием
Старый 12.07.2015, 14:58   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Чтот мне слабо верится, что обычное распределение в куче даст "прострелы".
Я бы вообще-то эту проблему назвал как переполнение стека, ну да ладно.
ИМХО проблема не в распределении памяти, как ты решил, а в том, как ты ее используешь. Так то конечно STL поудобнее будет, но не факт что решит твою проблему.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.07.2015, 15:42   #5
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
По умолчанию

Цитата:
Я бы вообще-то эту проблему назвал как переполнение стека, ну да ладно.
ИМХО проблема не в распределении памяти, как ты решил, а в том, как ты ее используешь.
Мне кажиться что проблема с переполнением стека может быть из-за 3д моделей, которые загружает моя программа. С двумя - тремя моделями программа справляется, но при добавлении 4-х и более начинаются прострелы.
Вот код выделения памяти для Вершин модели (кроме вершин в программе точно также выделяется память для текстурных координат, весов, костей и индексов всего этого)
Код:
//данные считываю из файла
is.seekg(SeekG);
Vertices = new float[VerticesSize];
is.read((char *) Vertices, sizeof(float) * VerticesSize);
SeekG += sizeof(float) * VerticesSize;

is.seekg(SeekG);
Textures = new float[TexturesSize];
......
Количество вершин у моделей более 200 000. Ну и костей, весов, текстурных координат, индексов примерно такое же количество (у каждого более 200 000). Получается 5 массивов примерно по 200 000 элементов каждый. Много ли это? Правильно ли я использую память?
gunsoy вне форума Ответить с цитированием
Старый 12.07.2015, 15:48   #6
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от gunsoy Посмотреть сообщение
Если я полностью заменю new delete на std::vector поможет ли мне это?
std::vector поможет в освобождении памяти, если эта проблема связанна с этим. Но он не поможет, если Вы где-то выходите за границу выделенной памяти.

Считаю, что нужно найти место, в котором происходит segmentation fault, тогда и станет все понятно.

Цитата:
Сообщение от gunsoy Посмотреть сообщение
Мне кажиться что проблема с переполнением стека может быть из-за 3д моделей...
Код:
//данные считываю из файла
is.seekg(SeekG);
Vertices = new float[VerticesSize];
is.read((char *) Vertices, sizeof(float) * VerticesSize);
SeekG += sizeof(float) * VerticesSize;

is.seekg(SeekG);
Textures = new float[TexturesSize];
......
С этим куском кода вроде все в порядке. Только не ясно для чего делать is.seekg(), если после is.read() он автоматически это делает.

Я вот только не понял, какое отношение выделение памяти имеет к стеку? Мы же не в стеке выделяем ее.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).

Последний раз редактировалось Stilet; 12.07.2015 в 16:35.
Krasiosoft вне форума Ответить с цитированием
Старый 12.07.2015, 16:38   #7
gunsoy
Форумчанин
 
Регистрация: 30.12.2010
Сообщений: 280
По умолчанию

Цитата:
Только не ясно для чего делать is.seekg(), если после is.read() он автоматически это делает.
Не знал этого.

После того как выделяю память, помещаю данные в VBO VAO, то есть в память видеокарты и сразу же удаляю delete [] Vertices; Вот и всё использование.

Прочитал про выход за пределы стека. До этого стек для меня был обычным массивом.

Цитата:
Считаю, что нужно найти место, в котором происходит segmentation fault, тогда и станет все понятно.
Как нужно вести поиск? Отладчик или что-то другое?

Последний раз редактировалось Stilet; 13.07.2015 в 08:11.
gunsoy вне форума Ответить с цитированием
Старый 12.07.2015, 23:23   #8
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от gunsoy Посмотреть сообщение
Как нужно вести поиск? Отладчик или что-то другое?
Когда программа запущенна под отладчиком и в ходе выполнения произошло какое-то исключение, то у меня IDE показывает это место и выбивает ошибку следующего содержимого:

error.png

Такую ошибку получаю, если выполняю этот код:
Код:
    int *i=0;
    *i=0;
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 13.07.2015, 09:57   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Ну правильно, это запись в неправильный адрес.
waleri вне форума Ответить с цитированием
Старый 13.07.2015, 15:58   #10
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Ну правильно, это запись в неправильный адрес.
Ну так отладчик же должен показывать все исключения? Или я ошибаюсь?

Это я привел пример с Qt Creator'a.
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Памяти VladimirAvakov Общие вопросы C/C++ 0 28.05.2014 23:01
Задача-найти объем оперативной памяти по шестнадцатеричному адресу последнего байта оперативной памяти Ksana Alex Помощь студентам 4 14.11.2013 15:51
Распределение памяти. Динамическое выделение памяти с++ Tolian92 Помощь студентам 8 14.05.2012 21:44
Программа для тестирования памяти, тестирование ячеек памяти Hunter557 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 30.01.2011 19:20
Кольцевая очередь на массиве в статической памяти с элементами в динамической памяти ]tach[ Общие вопросы C/C++ 1 19.01.2011 13:16