2012-11-15 27 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