함수에서 리턴된 객체의 유효범위
글쓴이: achrom / 작성시간: 금, 2005/06/10 - 9:33오전
안녕하세요.
다음과 같은 func()에서 리턴된 CTest 객체의 유효범위는 얼마나 될까요?
그리고, 아래와 같이 사용하면 문제가 있을까요?
class CTest { public: int a, b; }; CTest func(void) { CTest tmp; tmp.a = 10; return tmp; } int main(void) { CTest tmp; tmp = func(); // func()에서 리턴한 CTest를 이렇게 복사해주면 문제가 없을까요? printf("a = %d\n", tmp.a); return 0; }
Forums:
위의 예제에서라면 문제는 없지만, member variable의 형에 따
위의 예제에서라면 문제는 없지만, member variable의 형에 따라서 문제가 생길 수 있겠지요.
또 객체의 size가 커지게 되면 비효율적일테구요.
func 의 로컬변수은 tmp 는 func 함수가 return 됨과 동시
func 의 로컬변수은 tmp 는 func 함수가 return 됨과 동시에 유효하지 않게 됩니다. (모든 로컬변수가 그러하죠)
하지만 위의 코드 처럼 return 된 변수를 main 의 로컬 변수로 복사 했기 때문에 func 의 tmp 는 유효 범위가 지났지만 main 의 tmp 는 아직 main 이 return 되지 않았기 때문에 유효해서 위의 코드는 유효범위 측면 봤을 때, 전혀 문제가 없는 코드입니다.
변수의 유효성을 고민하신다면 이런식의 코드를 조심해야 합니다.
위 처럼 func 가 return 됨과 동시에 tmp 의 포인터는 유효하지 않게 되는데 그 유효하지 않는 포인터 값을 main 의 pTest 에 할당하고 사용하는 것은 문제가 있는 코드입니다.
위의 코드의 경우에는 대부분의 컴파일러에 이상없이 작동하겠지만, 위 코드처럼 사용해서는 안됩니다.
이런 코드는 당장은 문제가 없겠지만 다른 머신, 다른 컴파일러에서 어떻게
이런 코드는 당장은 문제가 없겠지만 다른 머신, 다른 컴파일러에서 어떻게 동작을 할지 아무도 장담을 할 수가 없습니다.
그리고 이건 ERROR입니다.
올바르게 수정을 해서 사용을 하세요.
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
생성자로 객체를 생성해서 리턴하세요.
컴파일러의 반환값 최적화(RVO, Return Value Optimization)에 의해 임시 객체가 생기지 않는 장점도 있습니다.
[quote="서지훈"]이런 코드는 당장은 문제가 없겠지만 다른 머신,
문제가 있는 코드 인가요?
저도 복사로 인한 비효율성 말고는 별 문제가 없다고 생각되는데요.
복사 생성자, 대입 연산자가 적절히 구성되어서 복사가 올바르다는 가정이면 별 문제가 없을거라 생각됩니다.
전혀이상이 없는 코드 같은데요.[code:1]typdef in
전혀이상이 없는 코드 같은데요.
class CTest 를 int로 바꿔바서 이상이 없으면 전혀 이상이 없는데..
(물론 멤버는 없다고 보고요)
고작 블로킹 하나, 고작 25점 중에 1점, 고작 부활동
"만약 그 순간이 온다면 그때가 네가 배구에 빠지는 순간이야"
[quote="ez8"][quote="서지훈"]이런 코드는 당장은 문제가
아...
제가... 주소를 넘기는 거랑 착각을 한듯 하군요.
여기선 넘겨 줄 경우 class의 값들만 그대로 넘겨 주니깐 전혀 문제가 없겠군요... ㅡ ㅡ ㅋ
그럼... 다들 나른한 오후 잘들 보내시길...^^
<어떠한 역경에도 굴하지 않는 '하양 지훈'>
#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);
답변 감사합니다.
답변 감사합니다.
저도 문제가 없을 것 같아 보였는데, 좀 찜찜해서, 확인차 질문드린 것입니다.
좋은 하루 되세요.
댓글 달기