在(运算符new(unsigned int)+22)处崩溃

时间:2019-03-07 07:30:33

标签: c++ memory-management opengl-es android-ndk new-operator

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;
}

2 个答案:

答案 0 :(得分:3)

运算符newnew[]崩溃可能是由于:

  • 分配失败。例如,如果infolen与可用内存相比太大。
  • 正在分配的对象的构造函数崩溃。但是对于GLchar,这不太可能。

您应该添加代码来处理异常,方法是将new封装在try .. catch块中(如here所示),以便优雅地终止。

如果使用nothrow调用new,则应检查返回的指针是否不同于nullptr,以避免讨厌的UB。

答案 1 :(得分:2)

我看到您的代码有两个问题:首先,您没有检查glGetShaderiv是否成功;如果不是,则infolen保持未初始化。少了一个问题,只有在越野车环境中运行时才有一个问题,那就是您没有使用length的{​​{1}}指针在末尾添加空终止符;检索该值以及进行一致性检查始终是一个好习惯。

我还建议您使用glGetShaderInfoLog而不是手动分配:

std::string