2010-11-18 175 views
2

內這裏是我的問題的描述:從全局變量

  • 有一類「Class_A」,需要的內存1076字節的建設 的實例。

sizeof(Class_A)= 1076 bytes;

  • 沒有爲Class_A的包裝類, 「Class_A_Wrapper」,在它的構造函數動態創建 「Class_A」 的一個實例:

#include "Class_A.h" 
Class_A_Wrapper{ 
    public: 
    Class_A_Wrapper();            
    ~Class_A_Wrapper(); 
    private: 
    Class_A* class_a;          
}; 

Class_A_Wrapper::Class_A_Wrapper(){ 
    class_a = new Class_A(); 
} 
  • Class_A_Wrapper對象全局聲明中第三個文件:

#include "Class_A_Wrapper.h" 

Class_A_Wrapper a_wrapper; 
  • 程序崩潰! 「主」 - 函數調用之前

程序崩潰,此刻,當它試圖創建 了「a_wrapper」 -object,爲Class_A_Wrapper調用構造函數,最後調用「class_a =新Class_A()」;由於我不明白的原因,編譯器將sizeof(Class_A)評估爲1044字節,而不是1076。 這不是我的代碼,這不是我用第三個文件在全局聲明對象,但我需要找到這個崩潰的原因,我真的很困惑。 我會非常感謝任何意見和提示,非常感謝你提前。

+1

如果Class_A位於共享庫中,請確保您用於鏈接的標頭與運行時加載的相同版本 – 2010-11-18 10:53:47

+3

向我們展示class_A的構造函數,並且您怎麼知道它分配了1044個字節 – Chubsdad 2010-11-18 10:55:05

+2

我粘貼了你的代碼放到一個源文件中,並添加了最少量的代碼來編譯它(Class_A的定義,Class_A_Wrapper的析構函數的空實現,一個空的main)。它對我來說運行良好。也許你的問題是你沒有發佈的代碼? – 2010-11-18 10:59:43

回答

1

我曾經有過類似的問題;它是由源文件2和定義Class_A構造函數的不同編譯選項引起的。在我的情況下,不同的選項會影響枚舉的大小(1字節與4字節),所以new調用分配的例如1044字節但是Class_A構造函數被初始化,例如1076字節。

編譯選項還有其他不同之處(例如指針的大小,結構打包選項,甚至可能使用條件編譯聲明Class_A的某些成員,即#ifdef)。

我當然不確定這是你的情況發生了什麼;只是分享我的經驗。

+0

謝謝你的想法。問題是,在Linux上的gcc下發生了同樣的崩潰,在那裏更容易檢查編譯選項,它們看起來是一樣的。但我現在再次檢查它...(我的其他編譯器是Borland Builder,它可能會導致編譯選項中的混淆...) – Yuliana 2010-11-18 11:38:40

+0

@Yuliana檢查Class_A聲明,如果它具有某些#ifdef隱藏某些成員 – 2010-11-18 11:51:27

+0

但我同時編譯所有的文件,所以它定義了一些東西,它是被定義的 - 或者不是? – Yuliana 2010-11-18 12:03:37