2012-11-15 4 views
2

클래스의 전용 변수에서 매우 이상한 동작을 만났습니다.개인 멤버 "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); 어떤 도움이되지 않습니다.

미리 감사드립니다.

+3

아마도 포인터가 매달려 있고 메모리를 덮어 쓰고있을 것입니다. 문제가 무엇인지 진단하려면 문제를 완전히 컴파일하고 보여주는 최소한의 예제를 작성해야합니다. 무슨 일이 일어나고 있는지 이해할 수 없기 때문에이 작업을 수행해야합니다. 떠나지 않은 "중요하지 않은"세부 정보가 쉽게 발생하는 이유 일 수 있습니다. 그리고 완전한 예를 들어서,'int main()'을 가져야한다는 것을 의미합니다. 모든 클래스는 완전히 정의되어야하며, 작성한대로 컴파일하고 실행할 수 있어야합니다. – Yakk

답변

1

의도하지 않은 것입니다. 포인터 앨리어싱이 계속 발생합니다. li 또는 fi 포인터 중 하나가 &current과 같은 위치를 가리키므로 bias_frag 안에 참조를 지정하여 할당하면 실수로 current 또는 그 일부를 덮어 씁니다.

문제를 해결하려면 왜 데이터 흐름을 거꾸로 추적하여 별칭이 지정된 포인터가 필요한지 알아야합니다. 우선, 컴파일러의 경고 수준을 올리고 모든 경고를 수정하십시오.

current의 값을 저장하고 복원하여 해결하지 마십시오. 더 큰 문제에 대한 붕대 일 뿐이며 장기적인 해결책은 아닙니다. 당신은 이미 정의되지 않은 행동의 땅에 들어갔고, 자신을 파헤 치려고하는 것은 효과가 없을 것입니다.

+0

get_bias를 호출하는 함수는 범위를 벗어날 수 있으므로 임시 변수를 사용하는 경우 범위를 벗어납니다. –