以下函数在 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_str() 获得的指针可能会因以下原因而失效:
- 将对字符串的非常量引用传递给任何标准库函数
因此,不要使用
c_str
作为函数参数,而是:
const char *str = filename.c_str();
stbi_load(str, ...);
当我们讨论这个问题时,你为什么不使用论证
path
?