"BUS_ADRALN - 无效的地址对齐"错误是什么意思?

Hem*_*ant 5 c++ unix gcc gdb core

我们在HPUX上,我的代码是用C++编写的.我们得到了

BUS_ADRALN - 地址对齐无效

在函数调用的可执行文件中.这个错误意味着什么?相同的功能工作很多次然后突然给它核心转储.在GDB中,当我尝试打印对象值时,它表示不在上下文中.任何线索在哪里检查?

Omn*_*ous 11

您遇到了数据对齐问题.这可能是由于尝试读取或写入某种坏指针而引起的.

数据对齐问题是当指针指向的地址未正确"对齐"时.例如,某些体系结构(例如旧的Cray 2)要求从内存中读取除单个字符以外的任何内容的任何尝试仅通过指针进行,其中指针的值的最后3位为0.如果任何最后一个3位为1,硬件将产生对齐故障,这将导致您遇到的问题.

大多数体系结构都不是那么严格,并且通常所需的对齐取决于所访问的确切类型.例如,32位整数可能只需要指针的最后2位为0,但64位浮点可能要求最后3位为0.

对齐问题通常是由导致SEGFAULT或分段错误的同类问题引起的.通常是未初始化的指针.但它可能是由于错误的内存分配器没有返回具有正确对齐的指针,或者是由于指针在不正确类型时的指针运算结果.

系统实现malloc和/或operator new几乎肯定是正确的,或者您的程序在它之前会崩溃.所以我认为糟糕的内存分配器是最不可能发生咆哮的树.我先检查一个未初始化的指针然后检查错误的指针算法.

另外,x86和x86_64体系结构没有任何对齐要求.但是,由于高速缓存行的工作方式,以及各种其他原因,性能通常是一个好主意,使数据在与存储的数据类型一样大的边界上对齐(即32位int的4字节边界).