malloc()으로 할당 받은 메모리의 크기를 아는 방법
글쓴이: indizarm / 작성시간: 화, 2003/10/07 - 11:45오전
동적으로 할당 받은 메모리의 크기를 아는 방법이나
함수 같은 것이 없을까요?
char* str; int str_size = 30; str = (char*)malloc(str_size);
이렇게 했을 때, str이 가리키는 메모리 블럭의 크기를
알 수 있는 방법이 궁금합니다.
free(str);
이렇게 했을 경우에 str가 가지고 있는 값은 NULL로
set되는 것이 아니었습니까?
그러면 어떻게 메모리가 반환되었는지 판단을 하죠?
단순히 메모리가 반환되었다고 '가정' 해야 하는 것인지...
Forums:
그건...
메모리의 할당과 반환은 어짜피 커널에서 해주는 것이므로 그 부분까지 신경 쓰실 필요는 없다고 생각됩니다...
커널에서 재사용 할 수 있으므로 '가정'이 아니고 실제로 반환된 것이라고 볼 수 있습니다...
free(str);
그리고 위의 코드의 의미는 str이 heap영역에 잡혀 있었던 str_size만큼의 메모리의 첫번째 주소 값을 가리키던 것을 끊어준다고 생각하면 쉬운 것 같습니다...Be at a right place at a right time...
정확한 답변은 아니지만.
연속으로 메모리를 할당하여, 그 포인터 차이가 실재로 할당된 메모리라고 고려하더군요.
자세한 내용은 Programming Pearls의 부록 3을 참고하세요.
그 외에도 디버깅 관련 책에 자료들이 좀 있는것 같더군요.
실제로 할당된 영역의 크기는, 요구한 크기보다 좀 크고, 요구한 영역의 앞과 뒤에 부가적인 링크정보 같은것이 포함되더군요, 얼라인먼트가 필요한 경우도 있고요, 디버그 버젼으로 컴파일하면, 보호 필드가 포함되는 경우도 있는것 같습니다.
실제로 할당된 영역의 크기가 좀 더 크다는 것이, 그 영역까지 사용할 수 있다는 의미는 아니니 주의 하세요.
Re: malloc()으로 할당 받은 메모리의 크기를 아는 방법
할당된 블럭을 가리키는 str 이 어느정도 크기를 잡고 있는지는 구현알 수 있는 함수가 없습니다. 또한 어떤 C library 냐에 따라 구현방식이 달라질 수 있으므로, 일반적인 방법은 없고, 각 library 마다 달리 알아내는 방법밖에는 없습니다.
제가 쓴글이긴 한데..
http://bbs.kldp.org/viewtopic.php?t=1244
참고하셔요.
free(str) 의 경우 str 값은 NULL로 채워지지 않습니다.
free( & str ) 이런 꼴의 프로토 타입이었다면 가능했을까 상황은 그렇지 않습니다.
---
http://coolengineer.com
답변 감사합니다. ^_^터미널에서 입력에 따라서 버퍼의 길이를 늘
답변 감사합니다. ^_^
터미널에서 입력에 따라서 버퍼의 길이를 늘리는
부분을 짜다가 생긴 의문에 관한 질문이었습니다.
즐거운 오후되세요.
What a Cool Days!!!
동적할당받은 메모리 블럭 크기구하기~
==========================================================================
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이 아닌 기록했던 값을 그대로 유지하고 있습니다.
==========================================================================
질문이 있는데요, _msize() 함수는 모든 리눅스 버전에 존재하는지요 ?
오래된 글타래에 댓글을 써서 좀 죄송하지만,
넘 궁금해서 댓글을 써 봅니다.
동적할당받은 메모리 블록의 크기를 _msize() 함수로 알 수 있다고 하셨는데,
제 장비(Fedora 14 x86_64)에는 /usr/include/malloc.h 파일에
_msize() 함수가 없는데요 ?
함수가 없는 경우에는 어떻게 동적할당된 크기를 알 수 있을까요 ?
------------------ System programmer...^^
_msize는 ansi 표준이 아닌 compile
_msize는 ansi 표준이 아닌 compile extenstion입니다. 즉 *nix에서는 제공하지 않습니다. Windows에서 지원하는 듯 하더군요. linux에서는 _msize대신 malloc_usable_size() 함수를 이용할 수는 있습니다만, man page에 보면 제가 해석을 잘못한 것인지는 모르겠지만 realloc을 위해서 사용하는 매커니즘은 아니라고 되어 있더군요. 제가 잘못 이해한 것인지 모르니 원문 첨부 합니다.
malloc_usable_size 를 호출해 보면 평균 char* 일 경우 4byte정도가 더 나옵니다. 물론 항상 4byte가 더 나오는 것도 아닙니다.
+ 추가
저도 궁금해서 검색을 조금 더 하다 보니.. 좋은 자료가 나오는 군요.:-)
http://studyfoss.egloos.com/5209389에서 발체했습니다
저도 궁금하여 찾아보고 나름 테스트 코드 만들어봤어요~
https://gitlab.com/soyeomul/test/-/raw/master/%EC%86%8C%EC%88%98_%EC%8B%9D%EB%B3%84/3.c
^고맙습니다 감사합니다_^))//
[우분투 18.04 파여폭스 나비에서 적었습니다]
댓글 달기