转换为C字符串会产生奇怪的符号

时间:2015-11-12 18:00:12

标签: c++ string char

所以我一直在学习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...

那为什么它表现得那么奇怪呢?为什么当我将它放在变量中时会产生这种奇怪的输出?

1 个答案:

答案 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());