C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[331] 아래 PRINTF함수에 대해서...
꼴(이성렬) [kkol] 7142 읽음    2002-05-01 13:03
아래 만인학님이 올리신 PRINTF함수는 편리하긴 한데..
한가지 중대한 문제가 있어서 이 게시판 성격에 맞지 않는 글임을 알면서
글을 올리게 됐습니다. ^^; 

문제가 되는 것은 마지막 리턴할때인데요.
return(strdup(temp));

strdup함수는 문자열의 크기만큼 새로운 메모리를 할당할수 있는 편리함이 있으나
메모리할당을 malloc함수를 사용하기 때문에 이 메모리를 해제해 주는것은 사용자의 책임이라고
할수 있습니다.
따라서 사용법은 아래와 같이 고쳐져야 겠지요.

char *p = PRINTF("%d",x);
ShowMessage(p);
free(p); //  메모리를 해제해 줘야하니까요.

이렇게 사용해야만 한다면 굳이 이 함수를 만든 의미가 없어질것 같습니다.


그래서 이런 문제를 피하기 위해 두가지 방법이 있는데요..

첫째는 ShowMessage함수를 PRINTF함수 내부로 넣어버리는 방법입니다.
이렇게 하면 간단하긴 하겠지만..
PRINTF함수의 사용 용도를 메시지 표시 전용으로 제한 할 수 밖에 없기 때문에
단지 그 용도로 쓰신다면 상관없겠지만
원래 함수를 만든 취지에는 맞지 않는거 같습니다.


두번째는
PRINTF함수 안에 문자열을 static으로 만드는겁니다.
char *PRINTF(char *fmt, ...) 
{ 
           static char temp[MAX_SIZE]; 
           va_list argptr; 
           int cnt; 

           va_start(argptr, fmt); 
           vsprintf(temp, fmt, argptr); 
           va_end(argptr); 

           return temp; 
} 

이렇게 하면 문자열 배열의 메모리가 해제될 염려는 없고요
항상 일정 크기의 메모리가 확보된다는 장점이 있습니다.
게다가 원래 의도한 사용법 대로 사용할 수 있다는거죠..




이 게시판 성격에 맞지 않는 글을 올린것 같은데...
문제가 있다면 삭제하도록 하겠습니다.
아제나 [azena]   2002-05-16 16:33 X
오호라 static 멋진 방법이군요. 멀티 쓰레드 프로그래밍에서 쓸 수 없다는 점만 빼고요.. ㅡ.ㅡ;;
민인학 [h2h1995]   2002-05-23 13:27 X
static으로 하니 안되는군요...
장성호 [nasilso]   2009-12-09 02:28 X
아제나님 말씀처럼 멀티쓰레드 프로그래밍에는 문제가 있겠죠..
그냥 AnsiString을 쓰면 더욱 편리할것 같습니다.

+ -

관련 글 리스트
331 아래 PRINTF함수에 대해서... 꼴(이성렬) 7142 2002/05/01
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.