У меня в настоящее время есть небольшая проблема с программой, которую я кодирую, это 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
Если вам нужна дополнительная информация/код просто скажите мне, я выложу его, как только смогу.
Вместо этого выполните отладку в отладчике, она остановится в месте сбоя, позволяя изучить как переменные, так и стек вызовов. Если отладчик останавливается в библиотечном коде, то подходите к стеку вызовов, пока не получите код. –
Также подумайте, что произойдет, если '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)), а затем вы можете проверить наличие ошибок. –
stoi не меняет ничего. Ширина и высота равны 20 (значение, которое я использую в качестве теста). –