同样的代码,在vs下运行正常,在android ndk下却崩溃:

signal 7(SIGBUS),code 1 (BUS_ADRALN),fault addr 0xe6b82793

Func(short *pVY[])

{

short *dstY[2] = {pVY[0],pVY[1]};//使用backtrace定位,crash在这一句

}

pVY[0],pVY[1]是从一个统一分配的buffer偏移得来的。

1.考虑内存对齐的原因

pVY[0],pVY[1]:0xee25ffe0,0xee262470 。都是32字节对齐的。

重新分配按64字节对齐,pVY[0],pVY[1]:0xee260600,0xee262b00 ,实际已经256字节对齐了,错误同样出现.

不是pVY[0]和[1]内存没对齐的原因

it appears that SIGBUS 7 is a data misalignment issue, and SIGSEGV 11 is a write to inaccessible memory.

打印出pVY的值为0xe6b82793,正好与fault addr一样,pVY + 1的值为0xe6b82797.

参考:http://stackoverflow.com/questions/13077791/fatal-signal-7-sigbus-at-0x00000000-code-2

Linux操作系统会对于 非对齐内存访问的进程,发送SIGBUS的信号,你的程序,接收到这个信号后,进行coredump,并退出了。

Windows操作系统允许 非地址对齐的内存访问(会损失性能),所以程序在Windows操作系统下,不会出现error。

Win32平台下的微软VC编译器在默认情况下采用如下的对齐规则: 任何基本数据类型T的对齐模数就是T的大小,即sizeof(T)。比如对于double类型(8字节),就要求该类型数据的地址总是8的倍数,而char类型数据(1字节)则可以从任何一个地址开始。Linux下的GCC奉行的是另外一套规则:任何2字节大小(包括单字节吗?)的数据类型(比如short)的对齐模数是2,而其它所有超过2字节的数据类型(比如long,double)都以4为对齐模数。

应该是对pVY,pVY+1的非对齐内存访问造成的,pVY(0xe6b82793)存的是(short*) pVY[0]。

pVY来自class的成员变量:

class A{

...

short *pVY[6];

};

在vs下调试,pVY 为0x001cd9a8,是8字节对齐的

在ndk下, pVY+0到5为:0xe6b82793,797,79b,79f,7a3,7a7,默认并没有对齐

解决办法:

1.不进行赋值,函数体内直接使用形参操作:

Func(short *dstY[])

{

for(x = 0;x<w;x++){

dstY[0][x] = x;

dstY[1][x] = x;

}

}

2.设置内存对齐

#pragma pack(push) //保存对齐状态
 #pragma pack(8)//设定为4字节对齐

class A{

...

short *pVY[6];

};

#pragma pack(pop)

在ndk下pVY的值为0xe6b82794

C++成员变量内存对齐问题,ndk下非对齐的内存访问导致BUS_ADRALN的更多相关文章

  1. python 私有和保护成员变量如何实现?—— "单下划线 " 开始的成员变量叫做保护变量,意思是只有类实例和子类实例能访问到这些变量;" 双下划线 " 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据

    默认情况下,Python中的成员函数和成员变量都是公开的(public),在python中没有类似public,private等关键词来修饰成员函数和成员变量.在python中定义私有变量只需要在变量 ...

  2. SpringMVC成员变量并发状态下使用测试

    1.SpringMVC默认是单例的,使用成员变量在并发状态下该成员变量的值是被共享的 测试平台 我们目前正在开发的电商项目  (架构组成SpringCloud + SpringBoot + Sprin ...

  3. 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态

    一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...

  4. Linux内存技术分析(下)

    Linux内存技术分析(下) 五.内存使用场景 out of memory 的时代过去了吗?no,内存再充足也不可任性使用. 1.内存的使用场景 page 管理 slab(kmalloc.内存池) 用 ...

  5. java在继承中父类的成员变量是否会被子类所覆盖

    假如 父类 int num =7:子类 int num =9:父类是否会被子类所覆盖? 给你看两个例子: 第一个例子: 第二个例子: 这两个例子的区别只有一句话   由此证明了子类从父类继承的时候   ...

  6. iOS 成员变量的作用范围

    /* 成员变量的作用范围: @public:在任何地方都能直接访问对象的成员变量 @private:只能在当前类的对象方法中直接访问,如果子类要访问需要调用父类的get/set方法 @protecte ...

  7. java笔记13之成员变量与局部变量

    成员变量和局部变量的区别 1在类中的位置不同 局部变量:类的方法体内 成员变量:类的方法之外 2内存的不同位置 局部变量:在栈内存中 成员位置:在堆内存 3生命周期不同 局部变量:随着方法的调用而存在 ...

  8. 「OC」点语法和成员变量的作用域

    一.点语法 (一)认识点语法 声明一个Person类: 1 #import <Foundation/Foundation.h> 2 3 @interface Person : NSObje ...

  9. c++设计成员变量可动态调整的动态类结构

    本文主要介绍一下如何使用c++设计成员变量可动态调整的抽象动态类结构.首先介绍一下项目中以前使用的一种类结构:静态类结构 1.静态类结构 很多时候,在项目开发中设计类结构时,我们往往有一种简单.直接的 ...

随机推荐

  1. Synergy 鼠标和键盘共享软件

    http://symless.com/nightly Synergy 正可以让你的多台电脑共享一套键鼠,甚至还可以共享剪贴板,如同一机多屏,并跨平台支持 .

  2. css样式管理

    css命名 传统网站页面(企业级),大概就是about,product,register等,他们的名字较好区分,他们的样式整体也不会很大,用简单的驼峰法就够了,或者简单的模块. 非传统企业页面,命名驼 ...

  3. Python开发【杂货铺】:五个知识点搞定作用域

    1.块级作用域 想想此时运行下面的程序会有输出吗?执行会成功吗? #块级作用域 if 1 == 1: name = "lzl" print(name) for i in range ...

  4. 多个java文件编译并打成jar包经典方法

    首先,多个java文件的编译 find . -type f -name *.java > compilelist (.代表当前路径) javac -cp "$CLASSPATH&quo ...

  5. raspberry pi

    1. Expend System (sudo raspi-config) 2. Change keybaord layout to 104 key (US) 3. Change update sour ...

  6. php函数、php定义数组和数组遍历

    <?php //php函数//1.简单函数//四要素:返回类型,函数名,参数列表,函数体 /*function Show(){ echo "hello";} Show();* ...

  7. [原创]java WEB学习笔记102:Spring学习---Spring Bean配置:bean配置方式(工厂方法(静态工厂方法 & 实例工厂方法)、FactoryBean) 全类名

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. mongodb版本特性

    2.x index,writeConcern, readPreference 3.0 wiredtiger,  pluggable staorage engine, improved mmapv1 3 ...

  9. AJAX-----15HTML5实现进度条上传

    目的当然还是为了提高用户的体验度嘛,, 废话不多说走码.... <!DOCTYPE html> <html lang="en"> <head> ...

  10. AJAX-----02远古时期的ajax

    其实也可以利用创建元素然后用添加属性的方法进行请求后端的