我使用stringstream来获取文本文件的内容(实际上,它是着色器代码源),以便将它传递给一个带有const char * const *的函数(glShaderSource) 。起初,我做了那个
std::stringstream buffer;
buffer << input.rdbuf();
char const *code = buffer.str().c_str();
glShaderSource(id, 1, &code, 0);
它没有用,因为代码的内容不是预期的。实际上,如果我这样做:
std::stringstream buffer;
buffer << input.rdbuf();
char const *code = buffer.str().c_str();
printf("Code*: %p\n", code);
printf("Buff*: %p\n", buffer.str().c_str());
printf("Code0: %c\n", code[0]); // ERROR: prints garbage.
printf("Buff0: %c\n", buffer.str().c_str()[0]);
printf("Code1*: %p\n", &code[1]); // ERROR: prints garbage.
printf("Buff1*: %p\n", &buffer.str().c_str()[1]);
printf("Code1: %c\n", code[1]);
printf("Buff1: %c\n", buffer.str().c_str()[1]);
我得到指针值的相同输出,缓冲区中字符的正确输出,但代码的内容是随机输出。
现在,如果我使用这样的函数:
void workaround(char const *code) {
printf("Code*: %p\n", code);
printf("Code: %s\n", code);
}
-------------------------------------
std::stringstream buffer;
buffer << input.rdbuf();
workaround(buffer.str().c_str());
printf("Buff*: %p\n", buffer.str().c_str());
printf("Buff: %s\n", buffer.str().c_str());
我得到了指针和字符串内容的正确值。
为什么这段代码有效而不是第一个?
答案 0 :(得分:2)
我发现了问题:std :: stringstream返回的字符串是临时的,只有在表达式结束时才有效。
要扩展buffer.str()的有效期,可以在对象上创建引用。该值的预期寿命将扩展到参考值之一。
以下代码有效:
std::string const &string = buffer.str();
char const *code = string.c_str();
glShaderSource(id, 1, &code, 0);