realloc에 대해서..

ddoman의 이미지

어떤 코드를 보다보니 realloc을 쓴 코드가 보이더라구요..
몇년동안 코드를 보아오면서 realloc을 적용한 코드는 처음 봤는데
정확한 이유는 몰라도 그냥..realloc이라는 함수에 대한 이미지가 안좋았거든요

아마도 내부적으론 기존의 메모리를 없에고 다시 새로운크기만큼 재할당이겠죠? 설마 진짜 기존껀 냅뚜고 연장이라는 개념이 가능하진않을거같아시리..(추측)
암튼..
그 코드에선 realloc을 적용시킬 버퍼가 어짜피 몇바이트 안되는것들이라서
재할당해도 별 오버헤드가 없을거 같다는 생각에 realloc을 쓴거라고 생각했는데 궁금중이 생겨서요.

과연 제가 realloc에 가지고 있는 부정적인(??) 이미지가 맞는지....
그리고 실제 코드에서 realloc을 쓰는곳이 많은지..
어떤경우에 쓰면 굳! 일지..
생각을 듣고싶네요..

cinsk의 이미지

realloc은 기존에 할당한 메모리를 증가시키거나 줄일 때 쓰입니다.

보통의 경우, 여유 공간이 있으면, 할당 공간을 없애고 다시 할당하지 않습니다만,
여유 공간이 없을 때에는 (즉 필요하다면) 다시 할당합니다.

따라서 기존에 할당된 곳을 가리키는 pointer를 그대로 쓸 수 없습니다.
realloc이 return한 pointer를 다시 받아 써야 하는 거죠.

그렇지만, realloc에서 첫번째 인자를 NULL로 주면 malloc과 완전히 같은
동작을 하게됩니다.

realloc이 쓰이는 가장 흔한 경우는 text file에서 한 줄을 읽을 때,
한 줄의 최대 길이가 미리 정해 지지 않았다면 realloc을 써서 memory를
그때그때 키워가며 한 글자씩 읽습니다.

vigor96의 이미지

흠...

윗분이 말씀하신대로....

realloc 은 기존 메모리 용량에 추가적으로 할당해 주고자 사용합니다.

realloc 이 없다면..

free 해주고..

다시 malloc 한 후에... 거기에 메모리 내용을 memcpy 로

복사해야 겠죠?..그 작업을 간편하게 해준다고..

생각하면 됩니다...

주의해야 할 점은 메모리 포인터가 변경될 수 있다는 점입니다.

메모리 블록이 적다면..그런 현상이 발생할 수 있겠죠...

vuccell의 이미지

free 해주고..
다시 malloc 한 후에... 거기에 메모리 내용을 memcpy 로
복사해야 겠죠?..그 작업을 간편하게 해준다고..
------------------------------------------------------
가 아니라
------------------------------------------------------
다른 포인터에 malloc을 한후 memcpy를 하고
그다음에 free해줘야겠죠?

먼저 free하면 memcpy할때 적어도 앞단의 정보는 약간 망가질듯.

choissi의 이미지

저도 malloc의 동작을 좀 분석하기 위해서 소스를 최근에 봤는데
realloc 알고리즘이 이렇다는 군요 ^^;

제 glibc 버젼은 glibc-2.1.3-15 입니다.

/*

Realloc algorithm:

Chunks that were obtained via mmap cannot be extended or shrunk
unless HAVE_MREMAP is defined, in which case mremap is used.
Otherwise, if their reallocation is for additional space, they are
copied. If for less, they are just left alone.

Otherwise, if the reallocation is for additional space, and the
chunk can be extended, it is, else a malloc-copy-free sequence is
taken. There are several different ways that a chunk could be
extended. All are tried:

* Extending forward into following adjacent free chunk.
* Shifting backwards, joining preceding adjacent space
* Both shifting backwards and extending forward.
* Extending into newly sbrked space

Unless the #define REALLOC_ZERO_BYTES_FREES is set, realloc with a
size argument of zero (re)allocates a minimum-sized chunk.

If the reallocation is for less space, and the new request is for
a `small' (<512 bytes) size, then the newly unused space is lopped
off and freed.

The old unix realloc convention of allowing the last-free'd chunk
to be used as an argument to realloc is no longer supported.
I don't know of any programs still relying on this feature,
and allowing it would also allow too many other incorrect
usages of realloc to be sensible.

*/

참고
ftp://g.oswego.edu/pub/misc/malloc.c
http://g.oswego.edu/dl/html/malloc.html
http://www.ezdoum.com/search.php?query=malloc

울랄라~ 호기심 천국~!!
http://www.ezdoum.com

댓글 달기

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