Предположим, у меня есть функция, например, так:Почему моя 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
заканчивает тем, что overwitten последующим обращением к get_shader
. Как это исправить?
Просто пытаюсь понять: я думал, что get_shader() вернет копию строки, так что бы указатель на c_str() был действителен в пределах остальной части области? – Knox
Да, он возвращает копию. Эта копия является временной. Когда вы вызываете функцию 'c_str()', вы получаете указатель на внутреннюю строку «c» временной 'std :: string'. После временного уничтожения этот указатель перестает быть действительным, и попытка доступа к нему не будет работать так, как вы хотите. – Niall
А я думал, что вызов get_shader() будет эквивалентен созданию 'std :: string' в текущей области, но теперь я вижу, что он доживает до конца вызывающего его оператора. Благодарю. – Knox