c++ - 在 (operator new(unsigned int)+22) 处崩溃

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

我正在尝试查找在 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;
}

最佳答案

运算符崩溃 newnew[]可能由以下原因引起:

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

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

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

关于c++ - 在 (operator new(unsigned int)+22) 处崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55038290/

相关文章:

c++ - 为什么模板只能在头文件中实现?

c++ - 错误代码 : C2661: no overloaded function takes 6 arguments

c - 将参数传递给多个线程

opengl-es - GLSL - 检查设置的属性

c++ - 为什么需要在 FormatMessage 中转换 lpBuffer (LPTSTR) 参数?

c++ - 函数模板在 clang 中失败

android - 如何在安卓游戏中释放/释放内存

linux - CMA问题(设计错误)

android - 有没有办法在 Android 上使用 OpenGL 在两个上下文/线程之间共享纹理?

ios - 向 VBO 提供数据