2013-02-16 5 views
0

저는 C++을 공부하기 시작했습니다. 지금은 포인터로 작업하고 있습니다. 나는 왜 다음 일이 일어나고 있는지 이해할 수 없다.C++의 포인터; 세분화 오류 오류 :

그래서 클래스 A와 B가 두 개 있다고 가정 해 보겠습니다. A는 정수 필드 (int valueA)를 가지고 B는 A *로 포인터 필드를가집니다. 아래에서는 두 클래스를 모두 보여 줬습니다.

class A{ 
    A::A(int value){ 
    valueA = value; 
} 


void A::displayInfo(){ 
     cout<<A<<endl; 
    } 
} 



class B{ 

    B::B(){ 
    a=0; 
    } 


    void B::printInfo(){ 
     a -> displayInfo(); //Segmentation fault 
    } 

    void B::process(){ 
    A new_A = A(5); 
    a = &new_A; 
    new_A.displayInfo(); //correct output 
    a -> displayInfo(); //correct output 
    } 
    } 

이제 메인 클래스에서 다음을 수행합니다. B 클래스의 인스턴스를 만들고 process() 및 print() 함수를 호출합니다. 출력에서 나는 5를 얻었고 5는 맞았고 Segmentation은 잘못되었다. 아무도 왜 이것이 일어나고 있는지 이해할 수있게 도와 줄 수 있습니까? 포인터에 대한 나의 현재의 이해에 따르면, 나는 올바른 것을하고 있습니까?

INT 주 (무효) {

B b_object(); 
b_object.process(); 
b_object.print(); 

}


그냥 내가 선언 A.h 및 B.h 파일이이 명확하게하기 위해 "valueA을 지능;" 및 "A * a;" 각기. 그리고 나는이 포인터없이 훨씬 쉽게 수행 할 수 있습니다 알고 있지만, 나는 포인터가 여기에 작동하는 방법을 배우려고 노력하고 있어요 : A는 (과정에서 지역 변수에 할당

+0

클래스 정의 다음에 세미콜론이 누락되어 클래스 정의에 'Class :: Method' _를 사용하면 안됩니다. –

+0

오류 수정하지 않고 서식을 지정하기 위해 코드를 편집했습니다. –

+0

@MartinshShaiters : 아니야. –

답변

3
A new_A = A(5); 
a = &new_A; 

에서 선언. process 함수가 끝나면 new_A이 범위를 벗어나서 소멸됩니다. 지금 a은 잘못된 개체를 가리 킵니다.

여기 실제 해결책은 이와 같은 포인터를 사용하지 않는 것입니다. 그러나 실제로해야 할 일이 있다면, 함수의 끝 부분을 마지막으로 동적으로 할당해야합니다. a = new A(5);과 함께하십시오. 프로그램의 어느 시점에서 delete a;인지 확인해야합니다. 그렇지 않으면 동적으로 할당 된 메모리가 유출됩니다.

+0

당신이 그것에 손가락을 넣은 것 같아요. 범위를 벗어나면 파괴됩니다. – Floris

+0

적어도 지금은 왜 작동하지 않는지 나는 이해한다고 생각합니다. 그리고 네가 맞습니다. "a = new A (5);" 문제를 해결합니다. 그러나 A (new_A)의 새 인스턴스를 만들고이 새 인스턴스를 가리 키도록 포인터 (a)를 업데이트하는 방법이 있습니까? – FranXh

+0

@FranXh 그게 당신이 전에하고 있었던 일입니다. 문제는 객체의 수명이 포인터의 수명보다 짧았습니다.포인터는 오브젝트가 범위를 벗어난 후에도 오브젝트의 위치를 ​​계속 가리 킵니다. 객체의 수명이 충분히 오래 유지되도록하는 다른 방법은 참조에 의해'process'에 전달하는 것입니다. 그런 다음 해당 참조의 주소를 가져올 수 있으며 참조되는 개체가 오래 지속되면 괜찮을 것입니다. –

0

D) (printInfo에 따라서 유효하지 않습니다)

0

변수 a은 당신의 방법에 로컬 - 당신이 process에 로컬 new_A를 만들고 a에 그 주소를 할당 클래스 레벨 여기

+0

내 B.h 파일에서 선언 했으므로 로컬이 아닙니다 – FranXh

+0

코드 조각에 관련 정보 (변수 선언)를 표시해야합니다. 변수 범위가 여기에 범인이 될 수 있습니다. – Floris

+0

좋아, 내가 질문을 편집 – FranXh