美文网首页
NDK错误:SIGBUS(BUS_ADRALN) 内存对齐或内存

NDK错误:SIGBUS(BUS_ADRALN) 内存对齐或内存

作者: 马脸剑之初 | 来源:发表于2021-01-29 14:08 被阅读0次

    错误描述:

    在中高端机型,IOS,PC测试正常,在VIVO,OPPO早期机型测试时,发现对象初始化时报错。错误信息如下图:


    {error}.png

    定位崩溃函数

    ndk文件夹\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin>arm-linux-androideabi-addr2line.exe -e so文件

    发现崩溃位于某对象池的对象初始化过程中某成员变量所在行(定位在头文件)。形如

    new (data[i])A()
    

    解决崩溃

    根据google对于该问题的描述,SIGBUS错误主要是由于内存对齐或者内存引用错误导致。整体的逻辑结构大概如下:

    class alignas(16) A{
        int a;
        char b;
        float c;
        void  doSth1();
        virtual void doSth2();
    };
    uint8_t *data=new uint8_t [sizeof(A)*5000];
    A newA=new (data[i])A();
    

    c++创建对象的过程主要包括三个:分配空间,初始化,赋值

    1,分配空间

    类的内存大小与其成员变量的大小是一致的。虚函数地址需要分配内存空间,普通成员函数不用分配。

    class A
    {
        int a;
        char b;
        float c;
        void doSth1();
    };    //size=12 取其最大成员变量的字节数进行对齐 
    
    class  A
    {
        int a;
        char b;
        float c;
        void doSth1();
        virtual void doSth2();
    };    //size=16 虚函数占用4个字节的内存空间,存储函数地址
    
    class alignas(32) A
    {
        int a;
        char b;
        float c;
        void doSth1();
        virtual void doSth2();
    };    //size=32 对齐
    

    2,初始化和赋值

    (1)变量的初始化放在初始化列表或者构造函数中实现。在C++ 标准中(除了C++11版本以后), 类的成员变量的初始化都是在构造函数中实现的,而不能在类中设定默认值。常量可以在类体中赋值。
    (2)初始化列表优先于构造函数运行

    相关文章

      网友评论

          本文标题:NDK错误:SIGBUS(BUS_ADRALN) 内存对齐或内存

          本文链接:https://www.haomeiwen.com/subject/qlkqtltx.html