我在類中的一個私有變量上遇到了一個非常奇怪的行爲。私有成員「當前」的值在成員函數的末尾異常改變
問題描述:類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);這沒有幫助。
預先感謝您。
您可能正在使用懸掛指針並覆蓋內存。爲了診斷你的問題,你需要編寫一個完全編譯和演示問題的最小例子。你需要這樣做,因爲你不明白髮生了什麼事情,而你忽略的「不重要」的細節可能很容易成爲它發生的原因。通過完整的例子,我的意思是它應該有一個'int main()',所有的類都應該被完全定義,並且你應該能夠按照書面的方式進行編譯和運行。 – Yakk