返回stbi_load函数的结果并将其用于glTexImage2D会导致内存冲突
Returning result of stbi_load function and using it for glTexImage2D causes memory violation
我对stbi库有一个问题,我想,也许你知道为什么这不起作用。我声明了一个这样的函数:
bool LoadTextureFile(std::string file, unsigned char ** pixel_data, int * width, int * height, int * n);
在这个函数中,我得到stbi_load直接保存在*pixel_data变量的结果:
*pixel_data = stbi_load(file.c_str(), width, height, n, 0);
// Do some more stuff till return
return true;
所以,现在我的pixel_data指针指向stbi_load结果的内存。现在我想在前面的函数中使用这个结果和glTexImage2D方法。这个函数在调用OpenGL的glTexImage2D方法之前调用LoadTextureFile方法,如下所示:
bool LoadTexture(...)
{
int tex_width, tex_height, tex_n;
unsigned char * pixel_data = NULL;
LoadTextureFile(filename, &pixel_data, &tex_width, &tex_height, &tex_n);
// Do something special ...
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tex_width, tex_height, 0, GL_RGB, GL_UNSIGNED_BYTE, &pixel_data);
stbi_image_free(&pixel_data);
// ...
}
但是如果我这样做,那么我在调用glTexImage2D时得到内存冲突消息。如果我将这整个魔法移动到LoadTextureFile中,在用stbi_load加载一个新的纹理文件之后,它就可以工作了:
bool LoadTextureFile(std::string file, unsigned char ** pixel_data, int * width, int * height, int * n)
{
unsigned char * = = stbi_load(file.c_str(), width, height, n, 0);
// Do some magic ...
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 80, 80, 0, GL_RGB, GL_UNSIGNED_BYTE, pixel_data);
stbi_image_free(pixel_data);
return true;
}
谁能告诉我为什么我得到这个消息和如何解决这个问题?
我想,这是一个保持预留内存安全的问题,但我不太确定,如何解决它。我之前在一个简单的控制台应用程序中尝试过,它可以工作。
谢谢你的帮助!
This:
unsigned char * pixel_data = NULL;
[...]
glTexImage2D(..., &pixel_data);
肯定不是你想要的。你正在使用先锋的地址到你的像素数据,而不是指针的值,所以你基本上是告诉GL使用你的堆栈内存的一些随机段作为纹理的源。应该是
glTexImage2D(..., pixel_data);
在第二个变量中,由于
这一行,实际发生了什么是不清楚的unsigned char * = = stbi_load(file.c_str(), width, height, n, 0);
没有意义,也不会编译。所以我认为这是在写问题时复制粘贴错误。但是很难猜测真正的代码会做什么。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 用于访问容器<T>数据成员的正确 API
- 重载操作程序时出错>>用于类中的字符串 memebr
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- C++中的cin.ignore()函数不适用于整个流
- 没有用于初始化C++中的变量模板的匹配构造函数
- 用于C++中带有数组和指针的循环
- 为什么它不适用于Visual 2019的原因
- 使用在用于SFINAE的void_t中具有参数的方法
- 在createdialog创建的窗口中捕获用于编辑控件的OnMouseMove消息
- 重载==不适用于二进制树
- Insert函数不适用于2 if语句C++
- 用于矢量处理的多个线程
- 使外部项目可用于find_package CMake
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 为什么模数运算符不适用于该代码
- 并行用于C++17中数组索引范围内的循环
- 将fold表达式与std::一起用于两个元组
- 返回stbi_load函数的结果并将其用于glTexImage2D会导致内存冲突