调用 stbi_load() 时发生访问冲突?

问题描述 投票:0回答:1

以下函数在 stbi_load 上抛出访问冲突异常,但我没有看到任何原因

unsigned int TextureFromFile(const char* path, const string& directory, bool gamma)
{

    std::string filename = std::string(path);
    filename = directory + '/' + filename;

    unsigned int textureID;
    glGenTextures(1, &textureID);

    int width;
    int height;
    int nrComponents;
    unsigned char* data = stbi_load(filename.c_str(), &width, &height, &nrComponents, 0);
    if (data)
    {
        GLenum format;
        if (nrComponents == 1)
            format = GL_RED;
        else if (nrComponents == 3)
            format = GL_RGB;
        else if (nrComponents == 4)
            format = GL_RGBA;

        glBindTexture(GL_TEXTURE_2D, textureID);
        glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data);
        glGenerateMipmap(GL_TEXTURE_2D);

        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

        stbi_image_free(data);
    }
    else
    {
        std::cout << "Texture failed to load at path: " << path << std::endl;
        stbi_image_free(data);

    }
    return textureID;


}

所以,我尝试弄乱变量。我用一些值初始化了 width、height、nrComponents,但令我惊讶的是,我又遇到了另一个访问冲突异常,现在对于这些变量来说,这看起来真的很奇怪。

c++ opengl access-violation stb-image
1个回答
0
投票

来自 cppreference - c_str():

从 c_str() 获得的指针可能会因以下原因而失效:

  • 将对字符串的非常量引用传递给任何标准库函数

因此,不要使用

c_str
作为函数参数,而是:

const char *str = filename.c_str();
stbi_load(str, ...);

当我们讨论这个问题时,你为什么不使用论证

path

© www.soinside.com 2019 - 2024. All rights reserved.