malloc()으로 할당 받은 메모리의 크기를 아는 방법

indizarm의 이미지

동적으로 할당 받은 메모리의 크기를 아는 방법이나
함수 같은 것이 없을까요?

char* str;
int str_size = 30;

str = (char*)malloc(str_size);

이렇게 했을 때, str이 가리키는 메모리 블럭의 크기를
알 수 있는 방법이 궁금합니다.

free(str); 이렇게 했을 경우에 str가 가지고 있는 값은 NULL로 set되는 것이 아니었습니까? 그러면 어떻게 메모리가 반환되었는지 판단을 하죠?

단순히 메모리가 반환되었다고 '가정' 해야 하는 것인지...

kukuman의 이미지

Quote:

free(str);

이렇게 했을 경우에 str가 가지고 있는 값은 NULL로
set되는 것이 아니었습니까?
그러면 어떻게 메모리가 반환되었는지 판단을 하죠?

메모리의 할당과 반환은 어짜피 커널에서 해주는 것이므로 그 부분까지 신경 쓰실 필요는 없다고 생각됩니다...

Quote:
단순히 메모리가 반환되었다고 '가정' 해야 하는 것인지...

커널에서 재사용 할 수 있으므로 '가정'이 아니고 실제로 반환된 것이라고 볼 수 있습니다...

free(str); 그리고 위의 코드의 의미는 str이 heap영역에 잡혀 있었던 str_size만큼의 메모리의 첫번째 주소 값을 가리키던 것을 끊어준다고 생각하면 쉬운 것 같습니다...

Be at a right place at a right time...

mrchu의 이미지

연속으로 메모리를 할당하여, 그 포인터 차이가 실재로 할당된 메모리라고 고려하더군요.
자세한 내용은 Programming Pearls의 부록 3을 참고하세요.
그 외에도 디버깅 관련 책에 자료들이 좀 있는것 같더군요.

실제로 할당된 영역의 크기는, 요구한 크기보다 좀 크고, 요구한 영역의 앞과 뒤에 부가적인 링크정보 같은것이 포함되더군요, 얼라인먼트가 필요한 경우도 있고요, 디버그 버젼으로 컴파일하면, 보호 필드가 포함되는 경우도 있는것 같습니다.
실제로 할당된 영역의 크기가 좀 더 크다는 것이, 그 영역까지 사용할 수 있다는 의미는 아니니 주의 하세요.

pynoos의 이미지

indizarm wrote:
동적으로 할당 받은 메모리의 크기를 아는 방법이나
함수 같은 것이 없을까요?

char* str;
int str_size = 30;

str = (char*)malloc(str_size);

이렇게 했을 때, str이 가리키는 메모리 블럭의 크기를
알 수 있는 방법이 궁금합니다.

free(str); 이렇게 했을 경우에 str가 가지고 있는 값은 NULL로 set되는 것이 아니었습니까? 그러면 어떻게 메모리가 반환되었는지 판단을 하죠?

단순히 메모리가 반환되었다고 '가정' 해야 하는 것인지...

할당된 블럭을 가리키는 str 이 어느정도 크기를 잡고 있는지는 구현알 수 있는 함수가 없습니다. 또한 어떤 C library 냐에 따라 구현방식이 달라질 수 있으므로, 일반적인 방법은 없고, 각 library 마다 달리 알아내는 방법밖에는 없습니다.

제가 쓴글이긴 한데..

http://bbs.kldp.org/viewtopic.php?t=1244

참고하셔요.

free(str) 의 경우 str 값은 NULL로 채워지지 않습니다.

free( & str ) 이런 꼴의 프로토 타입이었다면 가능했을까 상황은 그렇지 않습니다.

indizarm의 이미지

답변 감사합니다. ^_^

터미널에서 입력에 따라서 버퍼의 길이를 늘리는
부분을 짜다가 생긴 의문에 관한 질문이었습니다.

즐거운 오후되세요.

What a Cool Days!!!

shmhlove의 이미지

==========================================================================

malloc.h에 정의된 size_t _msize( void *p ); 함수를 이용하면 됩니다.
예제 첨부할께요~
※ 참고로 windows.h에 정의된 HeapSize(...) 함수도 크기를 알아올수 있답니다~

==========================================================================

int *pInt = (int*)malloc( sizeof(int) * 100 );
printf("크기 %d\n", _msize((void*)pInt) / sizeof(int));
free(pInt);

==========================================================================

동적할당된 메모리 블럭 앞뒤에 StartPointer와 EndPointer가 존재합니다.
만약 이 범위에 값을 쓰게되면 크래시가 나면서 Before ...xxxx... 혹은 After ...xxxx... 등의 오류메시지를 볼 수 있습니다.
그리고 free()할때는 사이즈를 확인해서 전체를 날리는 것이 아니라 시작주소를 날리는 방식으로 처리하는걸로 알고있습니다.
즉, free() 후 메모리 상태는 덮어쓰지 않는 이상 NULL이 아닌 기록했던 값을 그대로 유지하고 있습니다.

==========================================================================

ukyoukyo의 이미지


오래된 글타래에 댓글을 써서 좀 죄송하지만,

넘 궁금해서 댓글을 써 봅니다.


동적할당받은 메모리 블록의 크기를 _msize() 함수로 알 수 있다고 하셨는데,

제 장비(Fedora 14 x86_64)에는 /usr/include/malloc.h 파일에

_msize() 함수가 없는데요 ?


함수가 없는 경우에는 어떻게 동적할당된 크기를 알 수 있을까요 ?


------------------ System programmer...^^

김정균의 이미지

_msize는 ansi 표준이 아닌 compile extenstion입니다. 즉 *nix에서는 제공하지 않습니다. Windows에서 지원하는 듯 하더군요. linux에서는 _msize대신 malloc_usable_size() 함수를 이용할 수는 있습니다만, man page에 보면 제가 해석을 잘못한 것인지는 모르겠지만 realloc을 위해서 사용하는 매커니즘은 아니라고 되어 있더군요. 제가 잘못 이해한 것인지 모르니 원문 첨부 합니다.

The malloc_usable_size() function returns the usable size of the alloca-
tion pointed to by ptr.  The return value may be larger than the size
that was requested during allocation.  The malloc_usable_size() function
is not a mechanism for in-place realloc(); rather it is provided solely
as a tool for introspection purposes.  Any discrepancy between the
requested allocation size and the size reported by malloc_usable_size()
should not be depended on, since such behavior is entirely implementa-
tion-dependent.

malloc_usable_size 를 호출해 보면 평균 char* 일 경우 4byte정도가 더 나옵니다. 물론 항상 4byte가 더 나오는 것도 아닙니다.

+ 추가

저도 궁금해서 검색을 조금 더 하다 보니.. 좋은 자료가 나오는 군요.:-)
http://studyfoss.egloos.com/5209389에서 발체했습니다

malloc_usable_size() 함수는 현재 할당된 메모리 영역에서 사용할
수 있는 크기가 얼마인지를 알려준다. 메모리 할당 요청이 정렬 제한보다
 작은 단위의 크기이거나 정확한 크기의 chunk를 찾지 못한 경우에는
실제로 요청한 크기보다 큰 chunk가 할당되었을 수 있다.
(예를 들어 0바이트의 요청에도 16 바이트 크기의 chunk를 반환한다.)
 
이 함수의 반환값은 일반 chunk인 경우 다음 chunk의 prev_size
필드(footer)까지 이용할 수 있으므로 chunk 크기에서 (size 필드(header)에
필요한) 4바이트를 뺀 크기이며 mmap()으로 할당한 chunk의 경우에는 다음
chunk가 존재하지 않으므로 chunk 크기에서 8을 뺀 크기이고 free()된 chunk인
경우에는 (당연하게도) 0이다. 주의할 점은 fast bin에 속하는 chunk의 경우
free()된 후에도 곧바로 P 플래그가 지워지지 않기 때문에 malloc_usable_size()는
원래의 크기를 반환한다는 것이다.
파이썬3의 이미지

https://gitlab.com/soyeomul/test/-/raw/master/%EC%86%8C%EC%88%98_%EC%8B%9D%EB%B3%84/3.c

^고맙습니다 감사합니다_^))//

[우분투 18.04 파여폭스 나비에서 적었습니다]

댓글 달기

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