|
정성훈.해미 님이 쓰신 글 :
: char* function(인수) 혹은
: int* function(인수)
:
: 이런식으로 하면 님이 원하는 결과를 얻을 수 있겠군요.
초보가 보기에는 너무 막연하게 설명하신 것 같네요.
제가 좀 더 자세하게 설명해보죠.
배열을 포인터로 리턴한다고 해봅시다.
일단 함수 안에서 배열을 자동변수로 생성한다고 생각해보죠.
int* function(인수)
{
int foo[100];
... // 배열에 적당한 값 지정
return foo;
} // 에러입니다. 스코프를 벗어나는 순간 foo에 할당된 메모리는 소멸되어 버립니다.
리턴된 포인터를 사용하는 것은 예상하지 못한 결과를 발생시킵니다.
그러므로 보통 malloc이나 new를 써서 동적할당을 하는 방식을 사용합니다.
int* function(인수)
{
int pfoo = new int [100];
...
return pfoo;
}
실제로 이런 식의 함수를 사용하는 라이브러리도 있습니다.
대표적으로 볼랜드/터보 C의 strdup()과 M$ VC++의 _strdup()이 있죠(ANSI C에는 없습니다.).
char *strdup(const char *s);
문제는 이런 방식이 C/C++에서 일반적으로 사용되는 것이 아니기 때문에
메모리 누수 버그 발생의 원인이 된다는 것입니다.
즉 동적 메모리 할당을 할 때는 malloc()으로 할당한 변수는 free()로 해제하고,
new는 delete로, new[]는 delete[]로 해제해야 한다는 원칙을 지킬 수가 없습니다.
실제로 strdup로 할당된 메모리를 delete로 해제하면 문제가 생길 수 있습니다.
"도움말을 보아야" free로 할당해야 한다는 것을 알 수 있지요.
물론 자기가 직접 만든 위의 function 함수는 함수의 내부를 보고,
사용후에는 delete[]를 호출해서 메모리를 해제해야 한다는 것을 알 수 있지만,
이것은 함수 원형만을 외부에 노출한다는 구조화 프로그래밍의 원칙을 위배하는 겁니다.
쓸 데 없이 주석과 다큐먼트에 주의사항을 강조해야 하는 좋지 않은 설계 방식입니다.
이것은 굳이 배열 뿐만이 아니라, 구조체나 클래스를 리턴할 때도 마찬가지입니다.
그냥 값으로 리턴을 하던가, 함수의 인자에 포인터나 참조로 넘겨주어야(call by reference) 합니다.
즉, 동적 할당을 할 때는 함수 외부에서 malloc/new/new[]로 할당한 후,
이 배열이나 객체의 주소나 참조를 함수의 인자로 넘겨서 처리하고,
함수 호출이 끝나면 free/delete/delete[]로 해제하는 과정을 밟는 것이
C/C++의 원칙입니다.
C/C++은 개발자에게 많은 자유를 부여하는 강력한 언어이지만,
자유에는 책임이 따르는 법입니다.
좋지 않은 방법은 초보들에게는 아예 모르게 하는게 좋겠죠?
확실하게 알지않고, 적당히 알면 "다치는" 경우가 있기 마련입니다. ^_^
: wookmania 님이 쓰신 글 :
: : C 에서 함수의 리턴을 배열로 할수는 없습니까?
: : ㅡ.ㅡ;;
: : 배열을 리턴받아서 이용하려는데... 찾을수가 없네요 ㅡ.ㅡ;;
: : 이제막 시작해서리, 어렵네요.. ㅡ.ㅡ;
|