메모리의 동적 할당과 해제

zoopi의 이미지

안녕하세요

궁금한게 있어서 질문드립니다.

보통 우리가 메모리를 실행중에

동적으로 할당하면

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()를 명시적으로 안해줘도 되는 방법입니다.

답변 부탁드립니다.

seoleda의 이미지

동적할당을 하지 않고 포인터를 리턴하는 경우도 있습니다.
예를들면,
char *addstring(char *s1, char *s2)
{
static char s[512];
sprintf(s, "%s%s", s1, s2);
*(s + strlen(s1) + strlen(s2)) = '\0';
return s;
}
뭐 이런식이지요.

zoopi의 이미지

동적할당하는 줄이 있었는데

근데 해제하는 코드는 없군요...

몇일동안 이거때문에...

궁금해서 돌겠네요

정적변수나 전역변수를 사용해서 할수도 있지만

동적할당에 대한 질문입니다.

wariua의 이미지

opendir()에 할당을 하는 코드가 있다면 해제하는 코드는 아마도 closedir()에 있겠지요 :)

opendir() 소스까지 보셨다면 readdir()이 반환하는 데이터를 왜 해제시켜 주지 않아도 되는가는 따로 말씀드릴 필요가 없겠군요...
----
$PWD `date`

$PWD `date`

zoopi의 이미지

readdir은 예를 든 것일뿐이고요

혹시 그 readdir 함수 외에도

표준 라이브러리 함수 중에

동적할당은 분명 하는듯 한데

해제는 안시켜주는 함수가

있었던 듯 해서 -_-;

아니면 위에 예로 적어놓은 addstring 함수가

따로 프로그래머가 명시적으로 해제해주는 코드를 안적더라도

자동적으로 해제 시켜주는 방법이 있지 않나 해서 질문을 드립니다.

kewlbear의 이미지

표준라이브러리이기 때문에 자동으로 해제되거나 하는 것은 없습니다. 메모리를 동적으로 할당하면 반드시 해제하는 것이 좋은 습관입니다. 명시적으로 해제해야 하는 것이 문제라면 자바 같이 가비지 콜렉션이 되는 언어를 사용하십시요.

Necromancer의 이미지

그런거면 메뉴얼에 메모리할당 관련 경고가 있을겁니다.

opendir()는 별로 문제될거 같지는 않네요. closedir()에서 해제될테니.
이런건 없죠.

Written By the Black Knight of Destruction

Written By the Black Knight of Destruction

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.