Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
lan143
0 / 0 / 0
Регистрация: 10.12.2012
Сообщений: 15
#1

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

10.12.2012, 00:54. Просмотров 549. Ответов 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:
Код
#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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2012, 00:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Segmentation fault при вызове метода (C++):

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

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

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

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
10.12.2012, 00:58 #2
lan143, так это бесконечная рекурсия или я что-то не заметил.
0
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
10.12.2012, 01:03 #3
без всего кода трудно сказать.
быть может в некоторых случаях вот это условие возвращает тру:
if (m_items[i])
но это что-то неинициализированное. такое может быть из-за выходов за пределы, из-за порчи памяти в другом месте. отладочные трейсы втыкайте и смотрите лог. колл стек тоже не помешает.
0
lan143
0 / 0 / 0
Регистрация: 10.12.2012
Сообщений: 15
10.12.2012, 01:09  [ТС] #4
Цитата Сообщение от go Посмотреть сообщение
lan143, так это бесконечная рекурсия или я что-то не заметил.
Нет, для m_items тип Item, основной Player.

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

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

или же std::cout << "что-то" и запуск бинаря:
my_exe.exe >>log.txt
правда не знаю, будет ли это работать не в винде
0
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
10.12.2012, 01:23 #6
lan143, не вижу метода Item::RemoveFromWorld
0
lan143
0 / 0 / 0
Регистрация: 10.12.2012
Сообщений: 15
10.12.2012, 14:16  [ТС] #7
Цитата Сообщение от 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
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
10.12.2012, 14:17 #8
lan143, Если за end выходим очевидным образом. Или пытаемся разыменовать end.
0
lan143
0 / 0 / 0
Регистрация: 10.12.2012
Сообщений: 15
10.12.2012, 14:56  [ТС] #9
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
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
10.12.2012, 17:37 #10
lan143, может указатель разыменовываете, который непонятно куда ссылается. Повтыкайте печать куда-нибудь, что понять на какой строке она валится. Ну или в дебаге смотрите шаг за шагом.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2012, 17:37
Привет! Вот еще темы с ответами:

Segmentation fault :( - C++
#include&lt;iostream&gt; #include&lt;fstream&gt; using namespace std; struct test{ int id; char name; }; struct first{

Segmentation fault - C++
Доброго времени суток. Столкнулся в программе с ошибкой Segmentation fault. Вообще, задача отсортировать данные по одному из параметров, но...

Segmentation fault - C++
Почему при таком варианте происходит Segmentation fault? vec3f trace(const Scene&amp; scene, const Ray&amp; ray) { const RenderObject*...

Segmentation fault - C++
Пытаюсь реализовать генетический алгоритм на с++. Всего существует два класса: GeneticEngine, FitnessFunction. Класс FitnessFunction...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.12.2012, 17:37
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru