2015-06-23 3 views
0

У меня в настоящее время есть небольшая проблема с программой, которую я кодирую, это segFaults сразу после конструктора.Программа SegFaults сразу после конструктора. C++

Вот код:

void GameEngine::createMap(std::vector<std::string> &parse)                                      
{                                                      
    int x;                                                   
    int y;                                                   
    std::string strx;                                                 
    std::string stry;                                                 

    strx = parse.at(0);                                                 
    stry = parse.at(1);                                                 
    x = atoi(strx.c_str());                                                
    y = atoi(stry.c_str());                                                
    std::cout << "okokok" << std::endl; 
    //_gMap is a Graphmap*;                                            
    this->_gMap = new GraphMap(x, y);                                             
    std::cout << "okokokabc" << std::endl;                                            
} 

createMap() является функция, которая вызывается, когда сервер я подключен к присылает мне «МСЗ X Y \ п», она вызывается точно. с действительным X Y.

Итак, вот функция, которая вызывает конструктор моего класса (GraphMap). X и Y являются действительными числами

И вот класс GraphMap.

.hh

#ifndef GRAPHMAP_HH_ 
#define GRAPHMAP_HH_ 

class GameEngine; 

class GraphMap 
{ 
private: 
    int _height; 
    int _width; 
    int _squareSize; 
public: 
    GraphMap(int, int); 
    ~GraphMap(); 
    void draw(SDL_Renderer *); 
}; 

#endif 

И .cpp:

#include "GameEngine.hh" 
#include "GraphMap.hh" 

GraphMap::GraphMap(int width, int height) 
{ 
    std::cout << "testouilleee1" << std::endl; 
    _width = width; 
    std::cout << "testouilleee2" << std::endl; 
    _height = height; 
    std::cout << "testouilleee3" << std::endl; 
    _squareSize = 1000/width; 
    std::cout << "testouilleee4" << std::endl; 
} 

GraphMap::~GraphMap() {} 

void GraphMap::draw(SDL_Renderer *renderer) 
{ 
    int i; 
    int j; 
    for(i = 1 ; i <= _width ; i++) 
    { 
     for (j = 1 ; j <= _height ; j++) 
     { 
      SDL_Rect rect; 
      rect.x = ((i - 1) * _squareSize); 
      rect.y = ((j - 1) * _squareSize); 
      rect.w = _squareSize - 1; 
      rect.h = _squareSize - 1; 
      SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255); 
      SDL_RenderFillRect(renderer, &rect); 
     } 
     j = 1; 
    } 
} 

Дело в том, что я не могу понять, что выход:

$ ./run.sh 
okokok 
testouilleee1 
testouilleee2 
testouilleee3 
testouilleee4 
./run.sh: line 12: 10414 Segmentation fault  (core dumped) ./zappy_graph 127.0.0.1 4242 

Это означает, что его переходит к последней строке конструктора, но затем segFaults и не печатает «okokokabc», который я не могу понять.

Вот некоторые отладочной информации от GDB:

0x0000000000404556 in GameEngine::createMap (this=0x0, parse=...) at GameEngine.cpp:90 
90 this->_gMap = new GraphMap(x, y); 
(gdb) bt 
#0 0x0000000000404556 in GameEngine::createMap (this=0x0, parse=...) at GameEngine.cpp:90 
#1 0x000000000040561b in Command::msz (this=0x712360, cmd=..., game=0x0) at Command.cpp:32 
#2 0x000000000040647c in Command::Parse (this=0x712360, command=..., game=0x0) at Command.cpp:138 
#3 0x000000000040949b in Socket::selectSocket (this=0x7120a0) at Socket.cpp:67 
#4 0x000000000040441e in GameEngine::update (this=0x712010) at GameEngine.cpp:58 
#5 0x00000000004046f0 in GameEngine::run (this=0x712010) at GameEngine.cpp:110 
#6 0x000000000040968e in main (ac=1, av=0x7fffffffdd78) at main.cpp:22 

(gdb) print x 
$1 = 20 
(gdb) print y 
$2 = 20 

Если вам нужна дополнительная информация/код просто скажите мне, я выложу его, как только смогу.

+2

Вместо этого выполните отладку в отладчике, она остановится в месте сбоя, позволяя изучить как переменные, так и стек вызовов. Если отладчик останавливается в библиотечном коде, то подходите к стеку вызовов, пока не получите код. –

+0

Также подумайте, что произойдет, если 'width' равно нулю, что может произойти, если строка, предоставленная' atoi', не начинается с цифры (или, если это строка '' 0 ", конечно). Вы действительно должны использовать ['std :: stoi'] (http://en.cppreference.com/w/cpp/string/basic_string/stol) (или [' strtol'] (http://en.cppreference.com/w/cpp/string/byte/strtol)), а затем вы можете проверить наличие ошибок. –

+0

stoi не меняет ничего. Ширина и высота равны 20 (значение, которое я использую в качестве теста). –

ответ

3

GDB показывает, что GameEngine адрес 0x0:

GameEngine::createMap (this=0x0... 

Таким образом, проблема в том, что по какой-то причине указатель GameEngine неправильно (не был инициализирован или поврежден).

Обратите внимание, что этот указатель, кажется, исходит из, по меньшей мере,

Command::Parse (this=0x712360, command=..., game=0x0) 

(я полагаю, что последний параметр является сам GameEngine?)

Следует также отметить, что некоторые строки ниже есть правильный GameEngine объект:

GameEngine::update (this=0x712010) at GameEngine.cpp:58 

Если у вас есть только один GameEngine в программе (который я предполагаю, это дело), ​​то это означает, что GameEngine адрес как-то теряется между GameEngine::update() и Command::Parse().

+0

В основном игра, которую я передавала Command :: Parse(), не была инициирована, потому что класс, который вызывал синтаксический анализ, имел атрибут GameEngine _game, который не был инициализирован ... Это было очень немым ошибка от меня здесь. большое спасибо ! –

Смежные вопросы