Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 10.12.2012
Сообщений: 15

Segmentation fault при вызове метода

10.12.2012, 00:54. Показов 2067. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно такое дело, имеется следующий код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Item* m_items[PLAYER_SLOTS_COUNT];
 
Player::Player()
{
    ...
    memset(m_items, 0, sizeof(Item*)*PLAYER_SLOTS_COUNT);
    ...
}
 
void Player::RemoveFromWorld()
{
    ...
    for (uint8 i = PLAYER_SLOT_START; i < PLAYER_SLOT_END; ++i)
        if (m_items[i])
            m_items[i]->RemoveFromWorld();
}
Программа ловит Segmentation fault на m_items[i]->RemoveFromWorld(), но очень редко, не могу понять из-за чего. В gdb:
Code
1
2
3
4
5
6
7
8
9
10
11
#0  0x0000000000abf400 in Player::RemoveFromWorld (this=0x7fff80541000)
    at /home/x5/source/src/server/game/Entities/Player/Player.cpp:2442
No locals.
#1  0x0000000000a08433 in Unit::CleanupBeforeRemoveFromMap (
    this=0x7fff80541000, finalCleanup=true)
    at /home/x5/source/src/server/game/Entities/Unit/Unit.cpp:13247
        __FUNCTION__ = "CleanupBeforeRemoveFromMap"
#2  0x0000000000a0a34d in Unit::CleanupsBeforeDelete (this=0x7fff80541000, 
    finalCleanup=)
    at /home/x5/source/src/server/game/Entities/Unit/Unit.cpp:13269
No locals.
Никакой информации не вижу. Собирал без оптимизаций. g++ (Debian 4.7.1-5) 4.7.1. Подскажите пожалуйста, как можно решить эту проблему.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.12.2012, 00:54
Ответы с готовыми решениями:

Ошибка "Segmentation fault" при вызове метода erase() контейнера vector
Хочу убрать изолированные вершины в графе. На строке 75 выдает &quot;Segmentation fault&quot;. #include &lt;iostream&gt; #include...

Segmentation fault при работе со стеком
Господа, если не затруднит, помогите пожалуйста с этой проблемой: Код компилируется, запускается -- и сразу аварийно завершает работу....

Segmentation fault при наследовании класса
Доброго времени суток! Имею класс Initialise и класс Environment. В первом создаются экземпляры движка и прочие сопутствующие вещи....

9
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
10.12.2012, 00:58
lan143, так это бесконечная рекурсия или я что-то не заметил.
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
10.12.2012, 01:03
без всего кода трудно сказать.
быть может в некоторых случаях вот это условие возвращает тру:
if (m_items[i])
но это что-то неинициализированное. такое может быть из-за выходов за пределы, из-за порчи памяти в другом месте. отладочные трейсы втыкайте и смотрите лог. колл стек тоже не помешает.
0
0 / 0 / 0
Регистрация: 10.12.2012
Сообщений: 15
10.12.2012, 01:09  [ТС]
Цитата Сообщение от go Посмотреть сообщение
lan143, так это бесконечная рекурсия или я что-то не заметил.
Нет, для m_items тип Item, основной Player.

но это что-то неинициализированное.
В конструкторе инициализируется нулями, затем во множествах местах происходит изменение указателей. Весь код просто огромен и разбросан по всему проекту.

отладочные трейсы втыкайте и смотрите лог. колл стек тоже не помешает.
Не подскажите как их в GDB вызвать?
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
10.12.2012, 01:11
printf("тут всякая полезная инфа")
или fprintf

или же std::cout << "что-то" и запуск бинаря:
my_exe.exe >>log.txt
правда не знаю, будет ли это работать не в винде
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
10.12.2012, 01:23
lan143, не вижу метода Item::RemoveFromWorld
0
0 / 0 / 0
Регистрация: 10.12.2012
Сообщений: 15
10.12.2012, 14:16  [ТС]
Цитата Сообщение от go Посмотреть сообщение
lan143, не вижу метода Item::RemoveFromWorld
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Item : Object
{
    ....
}
 
class Object : ACE_Copy_Disabled
{
    ...
    virtual void RemoveFromWorld();
    ...
}
 
void Object::RemoveFromWorld()
{
    if (!m_inWorld)
        return;
 
    m_inWorld = false;
 
    // if we remove from world then sending changes not required
    ClearUpdateMask(true);
}
В Item RemoveFromWorld не определен, поэтому вызывается из класса Object.

Добавлено через 12 часов 47 минут
Ещё вопрос: а в каких случаях может падать на инскрементировании итератора std::map?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.12.2012, 14:17
lan143, Если за end выходим очевидным образом. Или пытаемся разыменовать end.
0
0 / 0 / 0
Регистрация: 10.12.2012
Сообщений: 15
10.12.2012, 14:56  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    typedef std::map<RepListID, FactionState> FactionStateList;
 
    for (FactionStateList::iterator itr = _factions.begin(); itr != _factions.end(); ++itr)
    {
        if (itr->second.needSave)
        {
            PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_REPUTATION_BY_FACTION);
            stmt->setUInt32(0, m_player->GetGUIDLow());
            stmt->setUInt16(1, uint16(itr->second.ID));
            trans->Append(stmt);
 
            stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_REPUTATION_BY_FACTION);
            stmt->setUInt32(0, m_player->GetGUIDLow());
            stmt->setUInt16(1, uint16(itr->second.ID));
            stmt->setInt32(2, itr->second.Standing);
            stmt->setUInt16(3, uint16(itr->second.Flags));
            trans->Append(stmt);
            itr->second.needSave = false;
        }
    }
Да, но вот тут по моему за end выйти невозможно, или я не прав?
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
10.12.2012, 17:37
lan143, может указатель разыменовываете, который непонятно куда ссылается. Повтыкайте печать куда-нибудь, что понять на какой строке она валится. Ну или в дебаге смотрите шаг за шагом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.12.2012, 17:37
Помогаю со студенческими работами здесь

Segmentation fault при использовании модуля <time.h>
Есть код time_t now; struct tm * ptr; static char tbuf; bzero(tbuf,64); time(&amp;now); ptr = localtime(&amp;now); strftime(tbuf, 64,...

Ошибка выполнения Segmentation fault при открытии файла
Привет всем! почему не открывается файл, не понимаю что такое? ubuntu 16, qt creator 3.6.1 #include &lt;string&gt; #include...

Ошибка "Segmentation fault" при организации дерева
Есть следующие функции Three сreateThree(Node **q) { if((*q)-&gt;p) { Three *one, *two; one =...

[C/C++] "Segmentation fault" при попытке передачи параметра командной строки.
Прога вылетает при попытке передачи параметра через командную строку.Такой код: #include &lt;iostream&gt; #include &lt;cstring&gt; ...

Segmentation fault
Пишу лабу для универа. В общем необходимо использовать только свои функции, никаких, str... подобных функций использовать нельзя. ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru