错误描述:
在中高端机型,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)初始化列表优先于构造函数运行
网友评论