Получение ошибки сегментации в коде C ++ - PullRequest
0 голосов
/ 27 октября 2011

Я использую C ++, code :: blocks (с включенными предупреждениями и проверил, чтобы убедиться) и SFML.

Я сам пытался найти ошибку, но я действительно не могу найти то, чтонеправильно.Я знаю, что означает сегфо, но это действительно меня озадачило.Могу добавить, что я новичок, но быстро учусь.

У меня есть основной основной класс void Engine, в котором есть метод void RenderFrame, который отображает каждый кадр приложения.Внутри указанного метода у меня есть этот код, который должен рисовать все плитки в окне рендеринга:

Tile* tile;    
for (short y = 0; y < mapHeight; ++y) {
    for (short x = 0; x < mapWidth; ++x) {
        tile    = currentLevel -> GetTile(x, y);

        if (tile) {
            tile -> Draw((x * tileSize), (y * tileSize), Wnd);
        }
    }
}

Метод GetTile должен возвращать плитку из std::vector<std::vector<Tile *> >

.Метод Draw только делает это:

void Tile::Draw(int x, int y, sf::RenderWindow *pWnd) {
    sprite.SetPosition(x, y);
    pWnd -> Draw(sprite);
}

Приложение компилируется просто отлично, но оно падает сразу после вызова sprite.SetPosition(x, y);

Это полный стек вызовов от отладчика:

#0 68701829 sf::Drawable::SetPosition(float, float) () (D:\Coding\C++\sfml\bin\debug\sfml-graphics.dll:??)
#1 004021F9 Tile::Draw(this=0x76ab8cd5, x=0, y=0, pWnd=0x3e3310) (D:\Coding\C++\sfml\include\Tile.cpp:12)
#2 00401D7E Engine::RenderFrame(this=0x3e3298) (D:\Coding\C++\sfml\include\Engine.cpp:106)
#3 00401B29 Engine::MainLoop(this=0x3e3298) (D:\Coding\C++\sfml\include\Engine.cpp:63)
#4 00401E27 _fu0___ZTIPKc(this=0x3e3298) (D:\Coding\C++\sfml\include\Engine.cpp:119)
#5 004022D6 main() (D:\Coding\C++\sfml\Main.cpp:8)

Надеюсь, этого достаточно для продолжения, и спасибо заранее.

Редактировать: О, и это из вывода отладчика.Program received signal SIGSEGV, Segmentation fault. In sf::Drawable::SetPosition(float, float) () Не дает больше информации о проблеме.

Ответы [ 3 ]

2 голосов
/ 27 октября 2011

Эта строка в обратной трассировке выглядит подозрительно:

#1 004021F9 Tile::Draw(this=0x76ab8cd5, x=0, y=0, pWnd=0x3e3310) 

Это, похоже, соответствует вашей функции Tile :: Draw, за исключением того, что указатель this смещен, что говорит о том, что это недопустимый указатель.Так что, возможно, ваш std::vector<std::vector<Tile *> > был как-то поврежден.

0 голосов
/ 27 октября 2011

Общая причина ошибок сегментации - разыменование нулевого или недействительного указателя. 1. Проверьте GetTile (), это вызывает ошибку?
2. Проверьте currentLevel перед разыменованием.

0 голосов
/ 27 октября 2011

Наиболее вероятное объяснение состоит в том, что указатель, возвращаемый currentLevel->GetTile(x,y), недопустим.Это может быть связано с тем, что он не был должным образом инициализирован (для NUL или действительного выделенного объекта) или потому, что объект, на который он ссылается, был уничтожен.Оба объяснят, что sprite не является допустимым объектом, и вызов SetPosition для этого объекта передаст недопустимый указатель this, который вызовет SIGSEGV.

...