为什么通过流获得的std :: string被覆盖?

比约恩

假设我有一个像这样的功能:

std::string get_shader(std::string path) {
     std::string fullpath = "./resources/shaders/" + path;
     std::ifstream vertexShaderFile(fullpath);
     std::ostringstream vertexBuffer;
     vertexBuffer << vertexShaderFile.rdbuf();
     return vertexBuffer.str();
}

然后像这样的一些代码:

GLuint vertex_shader;
GLuint fragment_shader;
GLuint program;

const GLchar * vertex_shader_source = get_shader("triangle_vertex.vs").c_str();

// At this point vertex_shader_source is correct.

const GLchar * fragment_shader_source = get_shader("fragment.vs").c_str();

// Now vertex_shader_source is the same as fragment_shader_source

我不明白为什么vertex_shader_source随后对的调用会使自己变得愚蠢get_shader我该如何解决?

尼尔
const GLchar * vertex_shader_source = get_shader("triangle_vertex.vs").c_str();

vertex_shader_source势必向“内”的临时值std::string从返回get_shader这根本不会“延长”临时文件的寿命。一旦该语句的执行完成并继续,该临时存储器及其内存(以及您现在持有的指针)将不再以定义的方式进行访问。

本质上,您正在调用未定义的行为。

的一个更合适的声明vertex_shader_source可能是作为一个std::string由于该值是从函数返回的,因此它是一个右值,并且将调用适当的move构造。

std::string vertex_shader_source = get_shader("triangle_vertex.vs");

如果您仍然const GLchar*在这一点上,vertex_shader_source.c_str()将做。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章