You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 05:57:03