72898


提示コードですが/**/部のコードは正常に動作し、コメントじゃない行のコードはstringstreamで.str().c_str();としているがために正常に動作しません。なぜこの２つは値が変わるのでしょうか？

[code]

        bool Shader::CompileShader(const char* fileName, GLenum type)
    {
    
        GLuint out_shader = glCreateShader(type);   //シェーダーオブジェクトを作成
    
        //シェーダーを読み込み 
        std::ifstream shaderfile(fileName); //読み取り用
        if (shaderfile.is_open() == true)   
        {
            /*
            std::stringstream sstream;
            sstream << shaderfile.rdbuf();
            std::string str = sstream.str();
            const char* cc = str.c_str();
            */
    
    
    
            std::stringstream sstream;
            sstream << shaderfile.rdbuf();
            const char* cc = sstream.str().c_str();
    
    
    
    
    
            glShaderSource(out_shader, 1, &cc, nullptr);
    
            glCompileShader(out_shader);
    
            //  printf("ファイル読み込み成功: %s\n", fileName);
            GetShader_Log(fileName,out_shader, GL_COMPILE_STATUS);
            glAttachShader(mShaderProgram, out_shader);
            shaderfile.close();
        }
        else {
            shaderfile.close();
            glDeleteShader(out_shader);
    
            //printf("ファイル: %s が存在しません。\n", fileName);
            return false;
        }
    
        glDeleteShader(out_shader);
    
        return true;
    }
    
[/code]


CC BY-SA 4.0
2020-12-26T02:34:31.393
72896
2020-12-26T03:29:56.910
question
c++
std::stringstream で.str().c_str(); と.str();の違いが知りたい


この記事が該当していそうです。  
[Don't let std::stringstream.str().c_str() happen to
you](https://blog.sensecodons.com/2013/04/dont-let-stdstringstreamstrcstr-
happen.html) の Did you see the problem? の部分。

つまり`const char* cc =
sstream.str().c_str();`のように書くと、`;`の時点で`sstream.str()`で取得した`std::string`のスコープが外れるので、それから`.c_str()`で取得したポインタも無効になると書いてあるようです。

解決策の方は貴方がコメントアウトした部分のように書かれています。


CC BY-SA 4.0
2020-12-26T03:29:56.910
72898
2020-12-26T03:29:56.910
26370
72896
answer