凌晨1:18 开始写点关于内存对其的思考.
首先在代码中有这样一个声明:
CHI_PLAY_AudioOut m_AudioOut;
其中
class CHI_PLAY_AudioOut{
.....................
CL_MS_FIFO m_Audio_RB;
........................
};
类CL_MS_FIFO:
class CL_MS_FIFO{
.......................
unsigned int m_ulSize;
MS_U8 *m_pRB;
unsigned int m_ulWritePos;
unsigned int m_ulReadPos;
............................
};
在开发过程发现,声明m_AudioOut时会调用m_AudioOut的构造函数,在该构造函数中调用 m_Auido_RB.RB_Init 函数对m_Audio_RB进行初始化,初始化后
m_Audio_RB.m_ulWritePos = 0; 然而跟踪发现,在RB_Init函数中 m_ulWritePos == 0 然而在m_AudioOut的构造函数中 m_Audio_RB.m_ulWritePos != 0, 有时很大.
在该声明语句设断点, 如图debug1_.jpg所示
&(m_AudioOut.m_Audio_RB.m_ulWritePos) 的值为:
0x06a8fec6
在断点窗口中选择DATA ,填写 *(unsigned int *)(0x06a8fec6) != 0 继续执行.程序中断,如图debug2.bmp所示.
发现 &(m_ulWritePos) = 0x06a8fecc .真是大吃一惊!!!!!!!!!!!!
且此时 *( unsigned int * ) ( 0x06a8fec6) = 11534340 (即 0xb00004);
&(m_ulSize) = 0x06a8fec4 ;
&(m_pRB) = 0x06a8fec8;
m_ulSize = 262144 (即 0x40000 )
m_pRB = 0x047c00b0;
*( unsigned int * ) ( 0x06a8fec6)的值刚好是 m_ulSize的高四位和m_pRB的低四位组成(牵涉到大端 和小端,我的机器是小端字节序).使用F10 跳过该断点,一直到 m_AudioOut声明处的下一条语句.如图debug3_.jpg所示
此时m_AudioOut.m_Audio_RB.m_ulWritePos = 11534340 (即 0xb00004);
我大胆猜想编译器可能因为某种原因在使得计算m_ulWritePos的地址有偏差,这种原因最有可能是内存对其.
在相关类的定义地方 添加语句:
#pragma pack( push )
#pragma pack( 8 )
......
#pragma pack ( pop )
问题解决.
在不同的函数体内,类的成员地址不同,原因是有内存对其导致.然而为什么会导致这个问题,我还没有搞清楚.
阅读(550) | 评论(0) | 转发(0) |