2012-11-15 26 views
2

我在類中的一個私有變量上遇到了一個非常奇怪的行爲。私有成員「當前」的值在成員函數的末尾異常改變

問題描述:類lapi_xmeef_table中的私有成員「current」的值在成員函數的末尾異常改變。

類1:lapi_xmeef 類2:lapi_xmeef_table(是lapi_xmeef的朋友,所以能直接或經由公共接口訪問lapi_xmeef私有變量)稱爲「當前的」在lapi_xmeef_table

class lapi_xmeef { 
    friend class lapi_xmeef_table; 
    ... 
    short bias_frag_layer; 
    int bias_frag_index; 
    ... 
    public: 
    // Add constructor 
    lapi_xmeef(); 
    // Add public interface 
    ... 
    void bias_frag(int *li, int *fi); 

}; 

class lapi_xmeef_table { 
    private: 
    lapi_xmeef *current; 
    ... 
    public: 
    lapi_xmeef_table(Lapi_ctl *ctl, int num_layer); 
    ... 
    void get_bias(int *li, int *fi); 
    ... 
}; 

專用變量是一個當前迭代器(類lapi_xmeef)。

成員函數只做只讀,它從它的私有成員中複製兩個值。顯示如下

void lapi_xmeef::bias_frag(int *li, int *fi) 
{ 
    *li = (short)bias_frag_layer; 
    *fi = bias_frag_index; 
} 

問題函數和變量:

void lapi_xmeef_table::get_bias(int *li, int *fi) 
{ 
// current is (lapi_xmeef *) 0x2a9a93c7f0 (a valid address) 
    current->bias_frag(li, fi); 
// current is (lapi_xmeef *) 0x2a000000df (a invalid address) 
} 

調用該函數電流以前是(lapi_xmeef *)0x2a9a93c7f0(有效地址) 後,電流(lapi_xmeef *)0x2a000000df(一無效地址)

每當成員函數被調用時都不會發生這種情況,在這種奇怪的行爲之前,它被稱爲很多時間沒有問題。

當下一次正在訪問當前成員時,會因無效地址被解除引用而發生段錯誤。

現在我的解決方案有一個臨時指針,用於在調用其成員函數之前保存當前值,然後在調用之後恢復它。有用。

void lapi_xmeef_table::get_bias(int *li, int *fi) 
{ 
    lapi_xmeef *temp = current; 
    current->bias_frag(li, fi); 
    current = temp; 
} 

但我真的想知道爲什麼以及如何解決它而不是這種棘手的方式。

爲什麼私有變量的值被改變了,它預期是相同的?

訪問私有varibale的方式有問題嗎?需要前綴還是「this」需要?我試過 - > current-> bias_frag(li,fi);這沒有幫助。

預先感謝您。

+3

您可能正在使用懸掛指針並覆蓋內存。爲了診斷你的問題,你需要編寫一個完全編譯和演示問題的最小例子。你需要這樣做,因爲你不明白髮生了什麼事情,而你忽略的「不重要」的細節可能很容易成爲它發生的原因。通過完整的例子,我的意思是它應該有一個'int main()',所有的類都應該被完全定義,並且你應該能夠按照書面的方式進行編譯和運行。 – Yakk

回答

1

什麼可能發生的是你有意外的指針別名正在進行。 lifi指針之一指向與&current相同的位置,因此當您在bias_frag內部取消引用並分配給它們時,意外覆蓋了current或其中的一部分。

要解決這個問題,您需要通過向後追溯數據流來弄清楚爲什麼要獲取別名指針。對於初學者來說,請提高編譯器的警告級別並修復所有警告。

不要試圖通過保存current的值並恢復它來解決它 - 這只是一個更大的問題的繃帶,並不是一個長期的解決方案。你已經進入了未定義行爲的領域,試圖挖掘自己並不會奏效。

+0

調用get_bias的函數可能會超出範圍,所以如果他使用臨時變量,它也會超出範圍。 – 2012-11-15 16:02:28