C++ SFML地牢游戏Room构造函数传入参数值损坏问题
问题概述
我正在使用C++和SFML开发一款地牢爬行者游戏,编译器为gcc 6.3.0(MinGW.org GCC-6.3.0-1)。我尝试通过Room类的二维向量创建关卡布局,Room类构造函数为Room::Room(std::string layout),布局由种子生成,每个房间种子以斜杠(/)分隔。
读取种子时,遇到斜杠就创建Room实例并加入向量。创建实例前,房间种子参数正常,但进入Room构造函数后,参数值出现损坏,指针地址也发生变化。
添加-fsanitize=address,undefined -Wall -Wextra编译参数后,出现编译警告及内部编译器错误。移除所有向量、二维数组相关调用后,构造函数仍会损坏参数,现寻求问题解决帮助。
相关代码
/* Get Level Layout */ layout = getLayout(level); //Calls SQLite DB layout_dim = getLayoutDim(level); //Calls SQLite DB rows = layout_dim[0]; cols = layout_dim[1]; std::vector<std::vector<Room*>> layout_2d(rows); std::string acumul = ""; int current_row = 0; int current_col = 0; for (size_t i = 0; i < strlen(layout.c_str()); i++){ if(layout[i] == '/'){ Room* r = new Room(acumul); layout_2d[current_row][current_col] = r; if(current_col + 1 == cols){ //That was last column on the row current_row ++; current_col = 0; } else{ current_col ++; } acumul = ""; } else{ acumul = acumul + layout[i]; } }
参数状态对比
构造函数前参数状态
npos:4294967295 _M_dataplus std::allocator<char> (base): std::allocator<char> _M_p: 0x8bdd98 "0 1001 0 0" _M_string_length: 10
构造函数内参数状态
npos: 4294967295 _M_dataplus std::allocator<char> (base): std::allocator<char> _M_p: 0x8bddd0 "�" _M_string_length: 9166224
编译日志
g++ main.cpp sMenu.cpp sSettings.cpp sGame.cpp Room.cpp ConfigFile.cpp common.cpp db.cpp sqlite3.o -fdiagnostics-color=always -fsanitize=address,undefined -Wall -Wextra -o C:\Users\ricc_\Documents\Proyectos\Development\madou4cplusplus\src\..\dist\madou4.exe -L..\lib -I..\include -lsfml-graphics -lsfml-audio -lsfml-window -lsfml-system -g sGame.cpp: In member function 'int sGame::getDataFromSeed(int)': sGame.cpp:32:32: warning: unused parameter 'seed' [-Wunused-parameter] int sGame::getDataFromSeed(int seed){ ^~~~ sGame.cpp: In member function 'virtual std::__cxx11::string sGame::Run(sf::RenderWindow&)': sGame.cpp:72:19: warning: unused variable 'r' [-Wunused-variable] Room* r = new Room(acumul); ^ common.cpp: In function 'std::__cxx11::wstring FromUTF8(const char*)': common.cpp:69:61: warning: comparison is always true due to limited range of data type [-Wtype-limits] else if(std::numeric_limits<wchar_t>::max() < 0x110000){ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~ db.cpp: In function 'int emptyCallback(void*, int, char**, char**)': db.cpp:7:32: warning: unused parameter 'data' [-Wunused-parameter] static int emptyCallback(void* data, int argc, char** argv, char** azColName){ ^~~~ db.cpp:7:42: warning: unused parameter 'argc' [-Wunused-parameter] static int emptyCallback(void* data, int argc, char** argv, char** azColName){ ^~~~ db.cpp:7:55: warning: unused parameter 'argv' [-Wunused-parameter] static int emptyCallback(void* data, int argc, char** argv, char** azColName){ ^~~~ db.cpp:7:68: warning: unused parameter 'azColName' [-Wunused-parameter] static int emptyCallback(void* data, int argc, char** argv, char** azColName){ ^~~~~~~~~ db.cpp: In function 'int langGetCallback(void*, int, char**, char**)': db.cpp:16:34: warning: unused parameter 'data' [-Wunused-parameter] static int langGetCallback(void* data, int argc, char** argv, char** azColName){ ^~~~ db.cpp:16:70: warning: unused parameter 'azColName' [-Wunused-parameter] static int langGetCallback(void* data, int argc, char** argv, char** azColName){ ^~~~~~~~~ db.cpp: In function 'std::__cxx11::string* langGet(std::__cxx11::string, int)': db.cpp:33:9: warning: unused variable 'rc' [-Wunused-variable] int rc = sqlite3_exec(DB, sql.c_str(), langGetCallback, (void*)"", NULL); ^~ db.cpp: In function 'int configSingleGetCallback(void*, int, char**, char**)': db.cpp:42:42: warning: unused parameter 'data' [-Wunused-parameter] static int configSingleGetCallback(void* data, int argc, char** argv, char** azColName){ ^~~~ db.cpp:42:78: warning: unused parameter 'azColName' [-Wunused-parameter] static int configSingleGetCallback(void* data, int argc, char** argv, char** azColName){ ^~~~~~~~~ db.cpp: In function 'std::__cxx11::string configSingleGet(std::__cxx11::string)': db.cpp:57:9: warning: unused variable 'rc' [-Wunused-variable] int rc = sqlite3_exec(DB, sql.c_str(), configSingleGetCallback, (void*)"", NULL); ^~ db.cpp: In function 'int getLayoutCallback(void*, int, char**, char**)': db.cpp:66:29: warning: unused parameter 'data' [-Wunused-parameter] int getLayoutCallback(void* data, int argc, char** argv, char** azColName){ ^~~~ db.cpp:66:65: warning: unused parameter 'azColName' [-Wunused-parameter] int getLayoutCallback(void* data, int argc, char** argv, char** azColName){ ^~~~~~~~~ db.cpp: In function 'std::__cxx11::string getLayout(int)': db.cpp:81:9: warning: unused variable 'rc' [-Wunused-variable] int rc = sqlite3_exec(DB, sql.c_str(), getLayoutCallback, (void*)"", NULL); ^~ db.cpp: In function 'int getLayoutDimCallback(void*, int, char**, char**)': db.cpp:90:32: warning: unused parameter 'data' [-Wunused-parameter] int getLayoutDimCallback(void* data, int argc, char** argv, char** azColName){ ^~~~ db.cpp:90:68: warning: unused parameter 'azColName' [-Wunused-parameter] int getLayoutDimCallback(void* data, int argc, char** argv, char** azColName){ ^~~~~~~~~ db.cpp: In function 'int* getLayoutDim(int)': db.cpp:105:9: warning: unused variable 'rc' [-Wunused-variable] int rc = sqlite3_exec(DB, sql.c_str(), getLayoutDimCallback, (void*)"", NULL); ^~ db.cpp: In function 'int configUpdate(std::__cxx11::string, std::__cxx11::string)': db.cpp:120:9: warning: unused variable 'rc' [-Wunused-variable] int rc = sqlite3_exec(DB, sql.c_str(), emptyCallback, (void*)"", NULL); ^~ db.cpp: In function 'int langGetCallback(void*, int, char**, char**)': db.cpp:16:12: internal compiler error: in pp_format, at pretty-print.c:630 static int langGetCallback(void* data, int argc, char** argv, char** azColName){ ^~~~~~~~~~~~~~~ db.cpp:16:12: internal compiler error: Aborted g++: internal compiler error: Aborted (program cc1plus) Please submit a full bug report, with preprocessed source if appropriate. See <http://gcc.gnu.org/bugs.html> for instructions.
内容的提问来源于stack exchange,提问作者Enrique López Sales
相关产品推荐
相关产品推荐

