2011-02-08 41 views
3

我有我的C++正在進行一個大型的應用程序,我們有,其中內聯函數返回錯誤值的一類。它看起來像被一個條目抵消了。內聯函數返回不正確的結果

這裏的代碼是如何設置的例子:

class Test 
{ 

private: 
    uint myVal1;  
    uint myVal2; 
    uint myVal3; 
    uint myVal4; 

public: 
    uint myFunct1() const { return myVal1 }; 
    uint myFunct2() const { return myVal2 }; 
}; 

我們所看到的是,myFunct1返回myVal2和myFunct2返回myVal3。如果我不使內聯函數按預期工作。

關於爲什麼會發生這種情況的任何想法?

在此先感謝。

+0

看起來像一個未初始化的變量(代碼中的其他地方)(指針)我.. – thbusch 2011-02-09 00:02:12

+1

讓我們排除真愚蠢的東西,你真的能肯定的值是否設置正確? – Nim 2011-02-09 00:02:30

+0

是的值是肯定設置正確的,它不是一個未初始化的變量,因爲所有的成員看起來是正確的,就像我說,如果我定義這些函數內的.cpp而不是。h文件一切正常工作 – JumboSmith 2011-02-09 00:19:51

回答

11

(我假設你上面貼實際上是從一些頭文件片段。)

之類的東西,通常發生在你的程序中不同的源文件與不同的內存佈局相關的設置編譯,就像一流的包裝和對齊設置。您的頭文件包含在這些不同的翻譯單元中,並且由於內存佈局設置中的差異而被解釋爲不同。

一旦你開始傳遞這些翻譯單元之間的Test對象,問題揭示本身。一個翻譯單元用一個存儲器佈局創建一個Test對象,然後另一個翻譯單元讀取它或寫入其中,假定存儲器佈局完全不同。在你的情況下,你的內聯函數在每個翻譯單元中的解釋是不同的。

如果你定義的成員函數作爲非內聯的,他們將承擔具體到它們所定義的源文件中的類內存佈局。這將清除地毯下的問題,並使事情「發揮作用」(因爲訪問功能現在與一個內存佈局綁定),但它仍然不是一個好的情況。它仍然會導致各種類似的問題。

確保在你的程序的所有源文件都具有完全相同級內存佈局設置編譯。

P.S.正如弗雷德在評論中指出的那樣,翻譯單元之間的類內存佈局差異可能是由於平淡無奇的事情造成的,因爲在修改源文件所依賴的頭文件後,忘記重新編譯源文件。

此類問題的另一個「流行」來源是依賴於預處理器指令(即通過#ifdef/#endif段定製的類佈局)的類定義。如果在包含頭文件的某些源文件中忘記#define重要的東西,那麼最終可能會針對該源文件中的類使用不同的內存佈局。

3

否,內聯函數應具有相同的結果的非聯的函數需要(當然)。所以,這個問題必須在其他地方,在你沒有顯示的代碼中。也許神奇地設定私人成員的價值?