PGR21.com
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
Date 2011/11/15 16:18:45
Name 페르마
Subject [c언어에서] 함수 정의에 사용한 변수들은 자동반환되나요?

제목을 c언어에서의 개념 질문입니다. 라고 하려다

질문의 요지를 쓰는게 나을 것 같아서 이렇게 올립니다.


질문드리고 싶은건 제목처럼 함수 정의에 사용된 변수들이 메모리에 남지않고

자동 반환되는지 여부입니다.


사실은 저 변수가 클래스일때 약간 헷갈렸는데요.



예를들면

class Test{
public:
    int a;
    void show();
}

이런 클래스가 있고


반환값이 Test 클래스인 ABC함수가 있다고 해볼게요.
Test ABC()
{
    Test i;
    .
    .
    .
    return i;
}

정의하면 이렇겠네요.


이럴 때 main 함수에서

   ABC().show;    <-- 이런 문구가 나왔을 때 저 ABC함수에서 만들어진 객체 i의 생존여부가 궁금합니다.



계속 메모리상에 남아있는건지, 아니면 해당 라인까지만 살아있다가 알아서 메모리반환되는건지 헷갈리네요..


통합규정 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++은 가물가물하네요.
Cazellnu
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() <- 이렇게 사용이 가능하길래 저런 의문이 생겼었습니다.

도움 많이 되었습니다.
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
119427 복싱관련 무릎부담 질문입니다. [2] 김롯데5628 11/11/15 5628
119426 올해 스타리그가 적게 열리는 이유는 무엇인가요? [4] 부지런1724 11/11/15 1724
119425 LOL 녹턴 질문입니다. [5] [RED]Sniper1741 11/11/15 1741
119424 영어고수님들..영어 발음 질문드립니다 [4] 다미1730 11/11/15 1730
119423 우리나라 런닝화시장을 어떻게 생각하세요? [4] whoknows2105 11/11/15 2105
119422 단어가 갑자기 기억이 안 나네요.ㅠ [7] 곰똘이2959 11/11/15 2959
119421 이 컴퓨터에 윈도우 7 설치 가능할까요? [1] 수퍼쪼씨1479 11/11/15 1479
119420 몇십년 후에도 회자될 아이돌 가수의 노래 있을까요? [19] 나는정이에사자다크항2096 11/11/15 2096
119419 VGA 카드 질문입니다. DVI만 있는 카드의 D-SUB 지원여부 [4] 못된고양이1263 11/11/15 1263
119418 [c언어에서] 함수 정의에 사용한 변수들은 자동반환되나요? [5] 페르마1551 11/11/15 1551
119417 대장암 관련 질문드립니다. [3] 꿈트리2046 11/11/15 2046
119416 넥서스s쓰시는분 있나요 [2] 진리는나의빛1956 11/11/15 1956
119415 FTA의 찬반 쟁점에 대한 질문입니다. [2] 호로토스2115 11/11/15 2115
119414 스타2 저테전 질문입니다. 언데드네버다��1458 11/11/15 1458
119413 북촌한옥마을 근처에서 여자친구랑 식사할곳 추천 부탁드립니다. [3] 나를찾아서2143 11/11/15 2143
119412 비틀즈 음악이 별로 좋지 않게 여기면 이상한건가요 [16] PokerFace2664 11/11/15 2664
119411 프야매 조언좀 부탁드립니다 [6] 개떵이다1534 11/11/15 1534
119409 좋아한다는 고백을 진심을담은 편지로길게써서줘도 될까요 [11] 박주영2941 11/11/15 2941
119407 [연예] 저한테 말고 다른사람에게더 친절하고 챙겨주려는 이성 [5] 1628 11/11/15 1628
119406 나레이션 적은 비용으로 녹음 할 수 있는 방법 좀 ㅠㅠ 설탕가루인형형1880 11/11/15 1880
119404 이번에 처음으로 스마트폰 4s 질렀는데요. 유용한 앱 추천좀 부탁. [2] 내사랑 복남2142 11/11/15 2142
119403 집주인이 위장전입신고를 해달라고 하시네요. [7] raika3268 11/11/15 3268
119402 영어 어플 어떤게 좋을까요 [4] 벗이1548 11/11/15 1548
목록 이전 다음
댓글

+ : 최근 6시간내에 달린 댓글
+ : 최근 12시간내에 달린 댓글
맨 위로