메모리의 동적 할당과 해제
안녕하세요
궁금한게 있어서 질문드립니다.
보통 우리가 메모리를 실행중에
동적으로 할당하면
int *p = (int *)malloc(sizeof(int));
나중에 사용이 끝나고 나면
free(p);
해서 해제를 하잖아요
제가 여러 사이트 돌아다니면서 찾아본바로는 운영체제 차원에서 프로세스가 끝나면
자동으로 동적으로 할당된 메모리를 다 해제시켜 주지만
실행중 메모리가 부족하거나 시스템의 성능을 저하시킬 요인이 될수 있으므로
반드시 free()를 쓰라고 되어있더군요
그러면 여기서 궁금한게 있습니다.
표준라이브러리에 구조체의 포인터를 리턴하는 readdir()함수가 잇는데
우리가 저 함수를 사용함으로써 생기는 구조체의 포인터는
이미 메모리상에 공간이 할당 되어있으니
생기는거 아니겠습니까?
그렇다고 readdir() 함수를 사용해서 리턴받은 포인터를 명시적으로 해제시켜주지도 않는데요
표준 라이브러리 함수는 사용하고 난후에 동적으로 할당된 공간들이
자동으로 해제가 됩니까??
예를 들면 두 문자열을 받아 더하는 함수가 있다면
char *addstring(char *s1, char *s2)
{
char *s = (char *s)malloc(strlen(s1) + strlen(s2) + 1);
sprintf(s, "%s%s", s1, s2);
*(s + strlen(s1) + strlen(s2)) = '\0';
return s;
}
뭐 대충 이렇게 있따고 해보죠
저기 addstring() 함수를 사용하면
동적으로 할당된 메모리의 포인터를 리턴하잖아요
char *s = addstring("aaa", "bbb");
그리고 프로그램의 끝에서는
free(s);
해줘야 메모리의 해제가 올바로 될텐데
free()를 명시적으로 안해줘도 되는 방법이 없을까요??
제가 궁금한건 표준 라이브러리 함수들의 메모리 할당, 해제 방법과
free()를 명시적으로 안해줘도 되는 방법입니다.
답변 부탁드립니다.
동적할당을 하지
동적할당을 하지 않고 포인터를 리턴하는 경우도 있습니다.
예를들면,
char *addstring(char *s1, char *s2)
{
static char s[512];
sprintf(s, "%s%s", s1, s2);
*(s + strlen(s1) + strlen(s2)) = '\0';
return s;
}
뭐 이런식이지요.
glibc의 opendir 소스중에.....
동적할당하는 줄이 있었는데
근데 해제하는 코드는 없군요...
몇일동안 이거때문에...
궁금해서 돌겠네요
정적변수나 전역변수를 사용해서 할수도 있지만
동적할당에 대한 질문입니다.
opendir()에 할당을
opendir()에 할당을 하는 코드가 있다면 해제하는 코드는 아마도 closedir()에 있겠지요 :)
opendir() 소스까지 보셨다면 readdir()이 반환하는 데이터를 왜 해제시켜 주지 않아도 되는가는 따로 말씀드릴 필요가 없겠군요...
----
$PWD `date`
$PWD `date`
아 제 말씀은...
readdir은 예를 든 것일뿐이고요
혹시 그 readdir 함수 외에도
표준 라이브러리 함수 중에
동적할당은 분명 하는듯 한데
해제는 안시켜주는 함수가
있었던 듯 해서 -_-;
아니면 위에 예로 적어놓은 addstring 함수가
따로 프로그래머가 명시적으로 해제해주는 코드를 안적더라도
자동적으로 해제 시켜주는 방법이 있지 않나 해서 질문을 드립니다.
표준라이브러리이기
표준라이브러리이기 때문에 자동으로 해제되거나 하는 것은 없습니다. 메모리를 동적으로 할당하면 반드시 해제하는 것이 좋은 습관입니다. 명시적으로 해제해야 하는 것이 문제라면 자바 같이 가비지 콜렉션이 되는 언어를 사용하십시요.
그런거면 메뉴얼에
그런거면 메뉴얼에 메모리할당 관련 경고가 있을겁니다.
opendir()는 별로 문제될거 같지는 않네요. closedir()에서 해제될테니.
이런건 없죠.
Written By the Black Knight of Destruction
Written By the Black Knight of Destruction
댓글 달기