崩溃在(operator new(unsigned int)+22)

问题描述 投票:1回答:2

我试图找到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;
}
c++ memory-management opengl-es android-ndk new-operator
2个回答
4
投票

运营商newnew[]崩溃的原因可能是:

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

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

如果你用nothrow调用new,那么你应该检查返回的指针是否与nullptr不同,以避免令人讨厌的UB。


2
投票

我看到你的代码有两个问题:首先你不检查glGetShaderiv是否成功;如果没有,那么infolen仍然没有初始化。如果在有缺陷的环境中运行,那么问题就更少了,而且你没有使用lengthglGetShaderInfoLog指针在末尾添加空终止符;检索该值以及一致性检查始终是一个好习惯。

另外我建议您使用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;
}
© www.soinside.com 2019 - 2024. All rights reserved.