当前位置:  开发笔记 > 编程语言 > 正文

从方法非确定性行为返回std :: string?

如何解决《从方法非确定性行为返回std::string?》经验,为你挑选了1个好方法。

我有一个读取文件并将其内容作为a返回的方法std::string.我使用return std::string来编译OpenGL程序.在某些情况下,由于一个或两个着色器部分(读取文件内容),链接失败(编译的顶点着色器已损坏.)NULL.

如果我一步一步调试我的代码一切都很好.

如果我打印文件内容,链接似乎失败的次数较少.

为什么它表现不同,哪里是我的错?

cout在年底始终打印正确的文件内容:

std::string read_file(const char* filePath) {
    std::string content;
    std::ifstream stream(filePath, std::ios::in);
    if (stream.is_open()) {
        std::string line = "";
        while(getline(stream, line)) {
            content += "\n" + line;
        }
    }
    std::cout << "read_file " << content << "end read_file" << std::endl; // always prints the correct content

    return content; // makes a copy, don't like that, unless RVO?..
}

fragmentSource和或vertextSource有时是空的:

    GLuint fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
    GLuint vertexShaderID = glCreateShader(GL_VERTEX_SHADER);

    const char* fragmentSource = tools::read_file(_fragmentShaderPath).c_str();
    std::cout << "vertext shader source: " << std::endl << fragmentSource; // empty sometimes
    glShaderSource(fragmentShaderID, 1, &fragmentSource, NULL);
    glCompileShader(fragmentShaderID);
    CheckCompilation(fragmentShaderID);

    const char* vertexSource = tools::read_file(_vertexShaderPath).c_str();
    std::cout << "vertext shader source: " << std::endl << vertexSource; // empty sometimes
    glShaderSource(vertexShaderID, 1, &vertexSource, NULL);
    glCompileShader(vertexShaderID);
    CheckCompilation(vertexShaderID);

    GLuint programId = glCreateProgram();
    glAttachShader(programId, fragmentShaderID);
    glAttachShader(programId, vertexShaderID);
    glLinkProgram(programId);

    GLint result = GL_FALSE;
    GLint infoLogLength;
    glGetProgramiv(programId, GL_LINK_STATUS, &result);
    glGetProgramiv(programId, GL_INFO_LOG_LENGTH, &infoLogLength);
    if (infoLogLength > 0) { // this fails sometimes, corresponding to either vertexSource or fragmentSource being empty
        std::vector infoLog(infoLogLength + 1);
        glGetProgramInfoLog(programId, infoLogLength, NULL, &infoLog[0]);
        std::cout << &infoLog[0] << std::endl;
    }

ybungalobill.. 10

更换

const char* fragmentSource = tools::read_file(_fragmentShaderPath).c_str();

std::string fragmentSourceStr = tools::read_file(_fragmentShaderPath);
const char* fragmentSource = fragmentSourceStr.c_str();

同样的事情vertexSource.

问题是您返回的字符串是临时的,因此在fragmentSource使用指向其数据的指针进行初始化后会被销毁,这fragmentSource表明存储已被破坏.



1> ybungalobill..:

更换

const char* fragmentSource = tools::read_file(_fragmentShaderPath).c_str();

std::string fragmentSourceStr = tools::read_file(_fragmentShaderPath);
const char* fragmentSource = fragmentSourceStr.c_str();

同样的事情vertexSource.

问题是您返回的字符串是临时的,因此在fragmentSource使用指向其数据的指针进行初始化后会被销毁,这fragmentSource表明存储已被破坏.


@RichardHodges:它必须是一个指向char的指针,因为`glShaderSource`获取一个指向chars指针数组的指针,所以你必须得到一个指向char的指针的地址,所以必须有一个指向char变量的指针.当然我们可以将`framentSource`改为`std :: string`,但是我们需要引入另一个变量并重构一些代码......
推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有