:: 게시판
:: 이전 게시판
|
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
통합규정 1.3 이용안내 인용"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
11/11/15 16:42
C++쪽이네요..
짧은 생각으로는 ABC()자체가 생성자호출하면서 객체를 임시생성하는데, 그 라인 지나면 소멸됩니다. 어차피 위에 소스에서 return 값으로 넘겨주는건 실제 객체라기 보다는 주소개념이니깐요.. (실제 소멸 되진 않지만 생성된 객체에 대한 접근할 수 있는 방법을 잃었기 때문에 소멸한다고 표현한거고, 이 객체는 가비지처리 되어 알아서 반환 될껍니다.) ..JAVA의 경우는 가비지 컬렉터가 알아서 해당 객체가 잡혀있던 메모리를 확보할텐데..C++의 경우는 가물가물하네요.. free를 시켰어야 되나..그랬던걸로 기억하는데 ..저런식으로 객체 생성해놓고 처리안하면 계속 메모리상에 쌓여있다가 아마 프로그램 종료시에 free 될껍니다. 오래되서 잘 모르겠네요.ㅠㅠ 그리고 ABC 함수에서 단순히 Test i; 만 선언하셨는데 저렇게 선언해놓고 return 하는 순간 객체 사라질겁니다. 동적할당이나 초기화 해줘야 되지 않나요? Java는 Test i = new Test(); 이런식으로 하는데 C++은 가물가물하네요.
11/11/15 16:43
포인터로 넘기고 받아야 됩니다.
윗분 말씀처럼 동적할당 해야되고 Test *i = new Test() 하시고 return i (물론 메소드 만들때 반환형도 클래스 포인터, Test *ABC() 이런식으로 만들어져야 겠지요)
11/11/15 17:22
흠.. 질문하신 님께서 쓰신대로 해도 되긴 됩니다.
객체가 스택에 생성되므로 함수 종료하면 메모리 반환할 필요 없이 자연히 사라지죠. 물론 객체 생성하고 소멸시킬때 생성자 소멸자는 다 호출되므로 객체 내부에서 잡은 리소스는 알아서 반환해줘야 하구요. 그리고 마지막에 객체를 직접 return하면 그건 원래 님이 스택에 최초에 만든 객체가 아니라 새로운 객체를 또 만들어서 객체끼리 assign을 하게 됩니다. =연산자를 오버로딩하면 이 과정에 개입할 수 있구요. ABC().show() 하면 ABC()에서 리턴된 객체는 해당 라인의 수행이 완료될때까지 생존하고 다음 라인에서 소멸됩니다. 하지만 C++ 이외의 다른 언어들은 객체를 스택에 만드는걸 허용안하기 때문에 Cazellnu님처럼 해주는 습관을 가지시는게 좋습니다. 님께서 질문하신건 그냥 된다.. 정도만 아시면 되고 가급적 안쓰는게 좋습니다. 질문하신 내용처럼 생존주기가 괭장히 애매모호하고, 또 그 과정에서 숨겨진 assign이 여러번 반복되기 때문에 속도가 느립니다. 그리고 assign 과정에서 의도하지 않은 버그가 발생하는 경우도 있습니다. assign에서 발생하는 버그는 짧게 설명드리기 어려운데.. 기본적으로 디폴트 assign 연산은 그냥 메모리 복사입니다. 즉 포인터같은 것도 그냥 메모리 복사해버립니다. 그럼 앞에것이 소멸되면서 소멸자에서 메모리 free를 했을때 assign 받은 놈이 free 된줄 모르고 또 free시킬 수 있습니다. 이해가 되시려나 모르겠네요.. 하여튼 그냥 안쓰시는게 백번 낫습니다.
11/11/15 19:09
물리적으로는 메모리가 살아 있을 가능성이 있지만, 논리적으로는 메모리가 존재하지 않습니다.
즉, 위의 예처럼 사용해서는 안 됩니다. 블럭 ( , ) 에 싸여 있고, malloc 또는 new 에 의해 생성된 변수(혹은 인스턴스)가 아니라면 블록을 벗어나는 순간 메모리는 해제 됩니다.
다시 말해 C++ 의 인스턴스라면 destructor 가 호출됩니다. 따라서 로컬 변수를 사용해서는 안 되고, malloc 또는 new 연산자를 통한 heap 영역에 메모리를 잡아야 합니다. 이와 관련된 내용은 변수의 life time(생명주기), scope 에 관한 부분은 참조하시면 보다 자세히 알 수 있습니다. + 여담으로 ABC().show() 와 같은 구문을 사용하려면 show() 라는 멤버함수가 static 으로 선언되어야 합니다. static void show(); // 이와 같이
11/11/15 22:38
질문자입니다. 답변해주신 분들 감사합니다.
ABC.show() <- 이렇게 사용이 가능하길래 저런 의문이 생겼었습니다. 도움 많이 되었습니다.
|