클래스의 전용 변수에서 매우 이상한 동작을 만났습니다.개인 멤버 "current"의 값이 멤버 함수의 끝에 비정상적으로 변경되었습니다.
문제 설명 : 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);
...
};
private 변수 인 현재 반복자 (클래스 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이다 (a 잘못된 주소)
이것은 이상한 행동이 있기 전에 멤버 함수가 호출 될 때마다 발생하지 않으며 많은 시간 문제없이 호출됩니다.
다음 번에 현재 구성원이 액세스되고 있으면 잘못된 주소가 역 참조되기 때문에 seg 오류가 발생합니다.
이제 내 솔루션에는 멤버 함수를 호출하기 전에 현재 값을 저장하는 임시 포인터가 있으며 호출 한 후이를 복원합니다. 그것은 작동합니다.
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