1

在我的项目中,我使用通过指定其文件名来加载纹理。现在,我创建了这个函数const char* app_dir(std::string fileToAppend);,它返回mainsargv[0]并将应用程序名称更改为fileToAppend. 由于无法使用 char* 轻松进行字符串操作,因此我使用std::string. 我的纹理加载器使用 const char* 作为文件名,因此需要切换回 c_str(),现在它会生成一系列 ASCII 符号字符(错误)。app_dir()我已经通过将返回类型更改为来解决了这个问题std::string。但为什么会这样?

编辑

示例代码:

//in main I did this

extern std::string app_filepath;

int main(int argc, char** arv) {

    app_filepath = argv[0];

    //...

}

//on other file

std::string app_filepath;

void remove_exe_name() {

    //process the app_filepath to remove the exe name

}

const char* app_dir(std::string fileToAppend) {

    string str_app_fp = app_filepath;

    return str_app_fp.append(fileToAppend).c_str();

    //this is the function the generates the bug

}

正如我之前所说,我已经通过将其返回类型更改为 std::string 来实现功能。

4

2 回答 2

1

A big no no :) returning pointer to local objects

return str_app_fp.append(fileToAppend).c_str();

Change your function to

std::string app_dir(const std::string& fileToAppend) {

string str_app_fp = app_filepath + fileToAppend;

return str_app_fp;

}

And on the return value use c_str()

于 2013-03-16T13:23:32.853 回答
1

当您使用函数const char* app_dir(std::string fileToAppend); 您将获得指向堆栈上分配的内存的指针,并且在函数结束时已被删除。

于 2013-03-16T13:08:03.037 回答