我知道这个“有时”有点违反堆栈溢出的规则,但是我不知道如何更好地描述我的问题:
我有此代码:
static const std::string parseShader(const std::string &fileName){
std::ifstream ifs(fileName);
std::stringstream buffer;
buffer << ifs.rdbuf();
std::string s = buffer.str();
return s;
}
在我的主要功能中,我有以下代码:
const GLuint vertex_shader = glCreateShader(GL_VERTEX_SHADER);
const char* vertex_shader_text = parseShader("res/shaders/basic.vertex.glsl").c_str();
std::cout << "Vertex shader length is " << strlen(vertex_shader_text) << std::endl;
glShaderSource(vertex_shader, 1, &vertex_shader_text, NULL);
glCompileShader(vertex_shader);
const GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
const char* fragment_shader_text = parseShader("res/shaders/basic.fragment.glsl").c_str();
std::cout << "Fragment shader length is " << strlen(fragment_shader_text) << std::endl;
glShaderSource(fragment_shader, 1, &fragment_shader_text, NULL);
glCompileShader(fragment_shader);
因此,如果我执行程序而没有移动文件或更改任何代码,有时会得到:
Vertex shader length is 160
Fragment shader length is 90
有时:
Vertex shader length is 0
Fragment shader length is 0
甚至大部分时间
Vertex shader length is 160
Fragment shader length is 0
因此,似乎文件读取的某些部分将是异步的,并且比程序的其余部分要慢。我正在使用C ++ 17,CLion和MacOS Mojave,作为其他信息。...
此外,当正确读取两个文件时,opengl(三角形)中的图像会正确绘制,但是当某些文件未正确读取时,则不会显示任何内容。
答案 0 :(得分:4)
问题在于该函数返回的字符串对象是 temporary ,并且将几乎立即终止其生命周期。这将为您提供一个指向不再存在的字符串的指针。
改为使用std::string
作为目的地,并且仅在绝对需要时才使用c_str
成员函数来获取指针。