객체를 리턴하는 경우에 대하여 질문드립니다.
C++코드를 작성하던 도중 어려움을 만나 질문드립니다.
코드 작성을 완료하고 컴파일을 하던 와중에, 동일한 파일로 입출력을 실행했음에도 불구하고
10번 컴파일을 시도했을때 1~2번정도 컴파일 오류가 발생하고 있습니다.
컴파일 오류가 발생하는 부분은 제가 person* a와 같이 선언한 객체포인터의 access 오류때문인 것 같은데(person은 클래스 입니다.)
제가 c++코드에서 구현한 과정은 다음과 같습니다.
1.person class가 존재합니다.
2. person* prs[150]을 private 멤버로 가지고 있는 people class가 존재합니다
3. 메인 함수에 person * a와 같이 객체포인터를 선언합니다.
4. 메인에서 people class를 선언한 후, people class에 있는 person *prs[150]중 특정 한 index,
예를 들어 prs[0]에 new person과정을 거쳐 동적할당 해준 후, 다음과 같은 method를 이용하여 리턴받습니다.
person*& people:: returnperson(){return prs[0];}
5. 다음과 같은 함수를 통하여 prs[0]의 주소를 메인에 선언해놓은 객체포인터 a에 저장합니다.
void function(person *&a, people& p){
a=p.returnperson();
}
위 과정을 거치면 a에 prs[0]의 주소값이 저장된 것이고, 결국 a나 prs[0]의 내부 값을 변화시키면 다른 한쪽의 값도 같이 바뀌는 것이 맞나요?
그리고 위 과정을 거친 후, 동적할당 했던 prs[0]를 동적할당 해제한 후, 다시 prs[0]를 동적할당 해주면,
a가 제대로된 값을 가리킬 수 있는지, 혹은 문제가 발생하는지 알고싶습니다.
문제가 발생하지요.
문제가 발생하지요.
1~5의 과정을 모두 거치고 나면 main에 있는 people instance의 prs[0]와, person에 대한 포인터 a는, 같은 주소값을 갖는 서로 다른 포인터가 됩니다.
prs[0]을 해제하고 새로 할당받는다고 해도 다른 포인터인 a의 값이 자동으로 바뀌지는 않으므로 (이미 해제된) 예전 주소값을 가지게 되지요.
그건 그렇고, "10번 컴파일을 시도했을때 1~2번정도 컴파일 오류가 발생하고 있습니다." 라고요? 정말요?
같은 주소값을 갖는 서로 다른 포인터 => 같은
같은 주소값을 갖는 서로 다른 포인터 => 같은 주소값을 저장하는 서로 다른 포인터
prs[0]을 해제하고 새로 할당받는다고 해도 => prs[0]가 가리키던 메모리를 해제하고 새로 할당하여 가리키게 해도
모호하게 읽힐 여지가 있는 부분을 다시 밝혀 씁니다.
친절한 답변 정말 감사합니다. 그런데 정말로 비쥬얼
친절한 답변 정말 감사합니다. 그런데 정말로 비쥬얼 스튜디오에서 컴파일을 실행한 경우에 10번에서 1~2번 꼴로만 에러가 발생하고 나머지는 정상적으로 작동합니다. 정말 의문이네요...
댓글 달기