所以我一直在学习OpenGL,并决定编写一个小的静态函数来从文件中加载着色器。这是:
std::string HM::GetShaderSource(std::string filename)
{
std::string shaderSource = "";
std::string line = "";
std::ifstream shaderFile(filename);
if (shaderFile.is_open())
{
while (getline(shaderFile, line))
{
shaderSource.append(line + "\n");
}
shaderFile.close();
}
else std::cout << "Unable to open shader file : " << filename << std::endl;
std::cout << " first output : " << std::endl << (const GLchar *)shaderSource.c_str() << std::endl;
return shaderSource;
}
然后我在我的代码中把它叫出来:
const char * vertexShaderSource = HM::GetShaderSource("VertexShader.txt").c_str();
std::cout << "second output: " << vertexShaderSource << std::endl;
std::cout << "third output: " << HM::GetShaderSource("VertexShader.txt").c_str() << std::endl;
这打印出来:
first output: ...Normal Shader Code...
second output: second output: ▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌
▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌▌7
first output: ...Normal Shader Code...
third output: ...Normal Shader Code...
那为什么它表现得那么奇怪呢?为什么当我将它放在变量中时会产生这种奇怪的输出?
答案 0 :(得分:3)
const char * vertexShaderSource = HM::GetShaderSource("VertexShader.txt").c_str();
将创建一个指向从GetShaderSource
返回的字符串的基础c样式字符串的指针。由于您从未捕获该字符串,因此它会在表达式的末尾被销毁。所以现在你有一个指针指向你不再拥有的内存。现在使用该指针是未定义的行为。
有两种方法可以解决这个问题。您可以捕获字符串,然后在函数中使用它
std::string vertexShaderSource = HM::GetShaderSource("VertexShader.txt");
the_function_you_want_to_call(vertexShaderSource.c_str());
或者如果你再也不打算再使用它,你可以让函数调用成为参数。
the_function_you_want_to_call(HM::GetShaderSource("VertexShader.txt").c_str());