在執行一些現有代碼的重寫以更好地流化線時,我在測試期間遇到了崩潰,我縮小到內存對齊問題,但我不知道如何解決它沒有掩蓋問題。有沒有我可能需要的編譯器原語。內存對齊導致使用Visual C++崩潰
我正在使用Microsoft Visual Studio 2008.
我有兩個文件。
FileA.cpp
class ClassA : public baseClass
{
public:
A() throw();
~A() throw();
virtual int Init() throw();
virtual int Start() throw();
virtual int Stop() throw();
virtual void Cleanup() throw();
public:
int *pap;
HANDLE m_evTimerStop;
unsigned char m_ctrl;
CAtlList<int> m_list;
}
在FileA.cpp,當我訪問m_list,一切都很好。
在FileB.cpp我已經聲明瞭一個全局變量
extern ClassA g_pCA;
所以,如果某些功能去訪問m_list:
g_pCA-> m_list.RemoveAt(POS);
它崩潰。如果我打電話: g_pCA-> m_list.GetCount();
在FileA中,計數將是正確的數字,比如10個元素。但是在FileB中,count是一些隨機的大數,有時候是負數。你得到的照片。
所以我設法跟蹤這個事實,例如,文件A.cpp中的m_list在地址0x9caba5,但在文件B.cpp中,m_list在0x9caba8。有一個3字節的差異,這讓我懷疑內存對齊。
如果我將m_list移到m_ctrl的上方,問題就會消失,並且地址在文件之間匹配。
或者,如果我再次將m_ctrl從無符號char更改爲int,問題顯然是由於對齊而固定的。
我不明白爲什麼編譯器在不同的文件中應用不同的內存對齊規則。
任何編譯器標誌來解決這個問題?
謝謝....荷銀
你不會碰巧擁有'雜注包(1)'在你的頭文件中的某處,有沒有機會?這不包括在其他頭部? –
事實上,我很確定「FileA.cpp」確實有一個'#pragma pack(1)'包含在某處,並沒有包含在「FileB.cpp」中 –