我有一个程序读取文件,将其存储为三角形网格,并使用OpenGL将其发送到GPU.我现在正在尝试为程序添加着色选项,以便我们可以进行平面或平滑着色.所以,我编写了一个函数,找到每个法线的法线,然后得到每个顶点的平均值,最终得到每顶点法线.
我相信一切都应该没问题.
但是,一旦我添加了这个,这个非常奇怪的错误完全让我失望,这是我运行程序的大约90%,我收到以下错误:
malloc: *** error for object 0x7fb16e942410: incorrect checksum for freed object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
Run Code Online (Sandbox Code Playgroud)
为了澄清,它应该只是在中心画出凹凸不平的立方体为红色.
我完全迷失了为什么我有时会得到一个malloc错误,有时会得到这个奇怪的图像.我相当肯定这个错误与法线有关,但这并不能解释看似随意的跑步.
我的顶点着色器和片段着色器是
const GLchar* vertex_shader =
"#version 150 core\n"
"in vec3 position;"
"in vec3 color;"
"in vec3 normals;"
"out vec3 FragPos;"
"out vec3 Normal;"
"out vec3 f_color;"
"uniform mat4 model;"
"uniform mat4 view;"
"uniform mat4 proj;"
"void main()"
"{"
" FragPos = vec3(model * vec4(position, 1.0));"
" Normal = mat3(transpose(inverse(model))) * normals;"
" f_color = color;"
" gl_Position = vec4(FragPos, 1.0);"
"}";
const GLchar* fragment_shader =
"#version 150 core\n"
"in vec3 Normal;"
"in vec3 FragPos;"
"in vec3 f_color;"
"uniform vec3 lightPos;"
"uniform vec3 lightColor;"
"uniform vec3 triangleColor;"
"out vec4 outColor;"
"void main()"
"{"
" float ambientStrength = 0.4;"
" vec3 ambient = ambientStrength * vec3(1, 0, 0);"
" vec3 norm = normalize(Normal);"
" vec3 lightDir = normalize(lightPos - FragPos);"
" float diff = max(dot(norm, lightDir), 0.0);"
" vec3 diffuse = diff * lightColor;"
" vec3 shaded_color = (ambient + diffuse) * f_color;"
" outColor = vec4(shaded_color, 1.0);"
"}";
Run Code Online (Sandbox Code Playgroud)
你得到的错误与着色器无关.你的程序中某处有一个免费使用或相关的bug.从本质上讲,你要么写出已分配内存区域的越界,从而破坏内存管理数据,要么在释放后写入内存.
越界的例子:
void out_of_bounds()
{
char *buf;
#ifdef __cplusplus
buf = new char[8];
#else
buf = malloc(8);
#endif
buf[8] = 'x'; /* out of bounds just one element past the end */
buf[999] = 'x'; /* out of bounds waaay past the end */
}
Run Code Online (Sandbox Code Playgroud)
免费使用后的例子:
void use_after_free(char *buf)
{
#ifdef __cplusplus
delete[] buf;
#else
free(buf);
#endif
buf[0] = '\0';
}
Run Code Online (Sandbox Code Playgroud)
该问题的错误信息非常明确:
malloc:***对象0x7fb16e942410的错误:释放对象的校验和不正确 - 对象可能在被释放后被修改.***在malloc_error_break中设置断点以进行调试
在程序的某个地方,你有一个错误,它在语义上等同于上面的说明性代码片段.你必须找到并解决这个问题.
最有可能的错误是在代码中读取文件并将其内容传递给OpenGL.