我在类中的一个私有变量上遇到了一个非常奇怪的行为。私有成员“当前”的值在成员函数的末尾异常改变
问题描述:类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