im正在尝试查找以下在Android上报告的崩溃原因:
在(运算符new(未签名整数)+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;
}
答案 0 :(得分:3)
infolen
与可用内存相比太大。 GLchar
,这不太可能。 您应该添加代码来处理异常,方法是将new封装在try
.. catch
块中(如here所示),以便优雅地终止。
如果使用nothrow
调用new,则应检查返回的指针是否不同于nullptr
,以避免讨厌的UB。
答案 1 :(得分:2)
我看到您的代码有两个问题:首先,您没有检查glGetShaderiv
是否成功;如果不是,则infolen
保持未初始化。少了一个问题,只有在越野车环境中运行时才有一个问题,那就是您没有使用length
的{{1}}指针在末尾添加空终止符;检索该值以及进行一致性检查始终是一个好习惯。
我还建议您使用glGetShaderInfoLog
而不是手动分配:
std::string