포인터를 리턴하는 함수에 대해 질문드립니다.

leadha의 이미지

보통 malloc 을 쓰면 반드시 free 를 할 것을 염두에 둬야 한다고 하는데요,
이번에 소켓을 공부하면서 구조체 포인터를 리턴하는 함수들을 보고 있으니 갑자기 헷갈리더라구요.
그런 함수들이 내부 지역변수를 만든 이후에 반환을 할 수는 없을거고,
그렇다고 malloc 으로 구조체를 만든 이후에 반환을 하면 free 를 해줄 곳이 따로 없지 않나요?
구조체 몇개 프로세스 종료시까지 해제 안해준다고 별일 없기는 하지만...

이해가 안되어서 질문드려봅니다!

익명 사용자의 이미지

어설프게 알면 설명을 제대로 들어도 아는게 없어서 어설프게 이해하게 됩니다
더 공부하신 다음 무엇을 모르는지 정확히 파악한 후에 물어보는게 좋습니다
질문자도 막연하게 모르는 것에는 그 누구라도 정확히 대답하기는 불가능합니다

leadha의 이미지

예를 들면 gethostbyname 함수의 경우 struct hostent 를 만든다음에 그의 포인터를 돌려주는데요.

(gdb) p *host_info
$2 = {h_name = 0x804b0f6 "naver.com", h_aliases = 0x804b008, h_addrtype = 2, h_length = 4, h_addr_list = 0x804b0d8}

생각해보니 main() context 에서는 제가 포인터만 선언하고 함수가 구조체를 만들어주더군요.

(gdb) p host_info
$1 = (struct hostent *) 0xf7fba9a0

stack 에 만들수는 없는 노릇이고, 위의 주소에 만들어서 리턴했길래 보니,

$ cat /proc/17885/maps

...

f7fb9000-f7fbc000 rw-p 00000000 00:00 0
f7fd8000-f7fdb000 rw-p 00000000 00:00 0
f7fdb000-f7fdc000 r-xp 00000000 00:00 0 [vdso]
f7fdc000-f7ffc000 r-xp 00000000 08:14 5375155 /lib/i386-linux-gnu/ld-2.19.so
f7ffc000-f7ffd000 r--p 0001f000 08:14 5375155 /lib/i386-linux-gnu/ld-2.19.so
f7ffd000-f7ffe000 rw-p 00020000 08:14 5375155 /lib/i386-linux-gnu/ld-2.19.so
fffdd000-ffffe000 rw-p 00000000 00:00 0 [stack]

vdso 라는 장소에다가 만들어서 넘겨준건데 vdso 에 대해서 공부하려니 아직은 수준이 아닌건지 잘 모르겠습니다.

지금 수준에서는 그냥 malloc/free 와 관계없이 동적할당을 하는 섹션이 하나 더 있다고 알고 넘어가도 될까요?

익명 사용자의 이미지

물리적이 아니라 추상적인 측면에서 접근해야 쉽습니다
운전 배울때는 핸들 브레이크 악셀에만 신경써야지 엔진 동작에 신경쓰면 면허못땁니다
배울때는 어설프게 뭘 더 알려고 하지말고 모르는게 뭔지에 집중해야 실력이 늡니다
그걸 모르면 수년을 공부해봐야 제자리 걸음이죠

익명 사용자의 이미지

FILE* 생각해 보시면 간단합니다. C API에서 포인터를 주는 함수들은 꼭 그에 대응하는 자원해제를 위한 함수들이 있습니다. FILE* 를 fopen으로 얻었을 경우에도 fclose함수로 해제해야 하죠.

익명 사용자의 이미지

An application should not try to release the memory used by the returned hostent structure. The application must never attempt to modify this structure or to free any of its components. Furthermore, only one copy of this structure is allocated per thread, so the application should copy any information it needs before issuing any other function calls to gethostbyaddr or gethostbyname.

이 경우 운영체제가 직접 알아서 해제합니다. 스레드당 하나씩만 유지되고 있다네요. 이경우 스레드 내부 지역의 변수에 할당하기 때문에(static처럼) 사용자가 별 신경쓸 필요가 없습니다.

leadha의 이미지

검색을 좀 더 열심히 해야겠네요!

익명 사용자의 이미지

구조체 포인터를 리턴하는 함수들은 대개 그 리턴받은 주소값을 가지고 구조체를 해제하는 함수들이 따로 있습니다.
CloseXXXX라던가 ReleaseXXXX라던가 하는 이름으로...
이런 함수들은 사용하던 자원을 반환함과 동시에 구조체에 할당된 공간도 해제하게 됩니다.
내부적으로 free 함수를 호출하겠죠.

혹은, 함수 내부에 static storage duration을 가지는 변수를 선언하여
함수가 끝난 이후에도 해당 메모리 공간에 접근할 수 있게 하는 경우도 있습니다.
이런 경우에는 굳이 프로그래머가 해제를 해주지 않아도 됩니다.
오히려 free() 하겠다고 덤비면 큰일납니다.

그리고 이 경우에는 global, local보다는
lifetime 또는 storage duration 측면에서 접근하시는게 좋습니다.
scope storage duration 으로 검색어 넣고 돌리셔서 찾아보십시오.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.