我试图找到android上报告的以下崩溃的原因:
崩溃在(operator new(unsigned int)+22)
这是否意味着内存未成功分配?如果是这样,添加std :: nothrow和null检查并退出程序是正确的解决方案吗?
有没有办法可以限制程序不分配,以便重现它?
崩溃的代码:
glCompileShader( VSID );
GLint vstat;
glGetShaderiv( VSID, GL_COMPILE_STATUS, &vstat );
if( vstat != GL_TRUE )
{
GLint infolen;
glGetShaderiv( VSID, GL_INFO_LOG_LENGTH, &infolen );
GLchar* infostring = new GLchar[infolen + 1];
glGetShaderInfoLog( VSID, infolen, nullptr, infostring );
infostring[infolen] = 0;
std::stringstream Error;
Error << "An Error occured while trying to compile"\
" Vertex Shader \"" << VertexShaderPath
<< "\":\n\n" << infostring;
}
我看到你的代码有两个问题:首先你不检查glGetShaderiv
是否成功;如果没有,那么infolen
仍然没有初始化。如果在有缺陷的环境中运行,那么问题就更少了,而且你没有使用length
的glGetShaderInfoLog
指针在末尾添加空终止符;检索该值以及一致性检查始终是一个好习惯。
另外我建议您使用std::string
而不是手动分配:
std::string infostring;
while( GL_NO_ERROR != glGetError() ); /* Flush Errors */
GLenum err;
glCompileShader( VSID );
if( GL_NO_ERROR == (err = glGetError())
){
GLint vstat = 0;
glGetShaderiv( VSID, GL_COMPILE_STATUS, &vstat );
if( (GL_NO_ERROR == (err = glGetError()))
&& vstat != GL_TRUE
){
GLint infolen = 0;
glGetShaderiv( VSID, GL_INFO_LOG_LENGTH, &infolen );
if( (GL_NO_ERROR == (err = glGetError()))
&& 0 < infolen
){
GLsizei returned_infolen = 0;
infostring = std::string(infolen, 0);
glGetShaderInfoLog( VSID, infolen, &returned_infolen, infostring.data() );
infostring.resize(returned_infolen);
err = glGetError();
}
}
if( GL_NO_ERROR != err
){
std::stringstream Error;
Error << "An Error occured while trying to compile"\
" Vertex Shader \"" << VertexShaderPath
<< "\":\n\n" << infostring;
}