malloc로 메모리 할당한 후 할당된 메모리의 크기를

lovejin0309의 이미지

안녕하세요.

malloc으로 메모리를 할당해 주었습니다.

그 다음에 할당된 메모리의 크기를 알아 보려면 어떻게 해야 하나요?

navidad의 이미지

기본적으로 제공되는 방법이 있나요?

제경우 찾지못했습니다. 혹시 찾으신 분있으면 알려주시구요..

동료직원의 도움으로 아래와 같은 방법으로 비슷한 문제를 해결한 적이 있습니다.

==============
malloc과 free를 재작성합니다.(M_malloc, M_free라고 가정하죠.)

M_malloc으로 메모리를 요청하는 경우 요청사이즈보다 4byte 크게 malloc합니다. 4byte 크게 잡은 부분에 궁금해 하시는 할당한 메모리크기를 넣어두세요. (큰 메모리를 다루실꺼면.. 이부분을 늘려도 되겠습니다.)

M_malloc에서 return하는 포인터는 4byte를 skip한 이후의 addr를 반환하는 거죠..

M_free에서는 전달받은 포인터의 4byte 앞의 주소를 free하면 되겠죠..

=================================
나비아빠

neogeo의 이미지

malloc 의 인자 자체가 원하는 용량인데 모르는 것이 말이 안되지 않나요?

10개 달라고 해놓고 9개 받는경우는 없습니다.

12개를 받는경우도 없구요.

10개보다 못 받을 상황이면 ( 9개 밖에 못 받을 상황이면 ) 무조건 malloc 의 리턴 인자가 NULL 입니다. ( 즉 실패 입니다. )

12 개를 줄수 있어도 10개만 쓰게 하면 됩니다.
( 강제로 그 10개 뒤에 뭔가 써버릴수는 있겠죠. 이건 전적으로 프로그래머 잘 못 입니다. 애초에 자신의 사이즈를 알고 메모리를 할당받아야지 모르고 할당받는것은 말이 안됩니다. )

Neogeo - Future is Now.

lacovnk의 이미지

neogeo wrote:
malloc 의 인자 자체가 원하는 용량인데 모르는 것이 말이 안되지 않나요?

10개 달라고 해놓고 9개 받는경우는 없습니다.

12개를 받는경우도 없구요.

10개보다 못 받을 상황이면 ( 9개 밖에 못 받을 상황이면 ) 무조건 malloc 의 리턴 인자가 NULL 입니다. ( 즉 실패 입니다. )

12 개를 줄수 있어도 10개만 쓰게 하면 됩니다.
( 강제로 그 10개 뒤에 뭔가 써버릴수는 있겠죠. 이건 전적으로 프로그래머 잘 못 입니다. 애초에 자신의 사이즈를 알고 메모리를 할당받아야지 모르고 할당받는것은 말이 안됩니다. )

library간에 넘겨주고 그러면 모를수도 있죠 뭐~

앞 분 처럼, 재작성해서 정보를 넣는 방법이 유력해 보이는군요 ㅎㅎ

superkkt의 이미지

free 함수가 해제해야할 메모리의 크기를 알고있는걸 보면 뭔가 방법이 있지 않을까요?

======================
BLOG : http://superkkt.com

happyjun의 이미지

superkkt wrote:
free 함수가 해제해야할 메모리의 크기를 알고있는걸 보면 뭔가 방법이 있지 않을까요?

표준적인 방법은 없습니다.

ps. allocation table을 따로 두어 관리하는 방법, 위의 분 예제 처럼 allocation된 memory의 처음 부분에 length를 기록하는 방법, ... 등등 제 각각입니다.

----------------------------------------
http://moim.at
http://mkhq.co.kr

jsunam의 이미지

malloc()으로 얼마나 많은 메모리가 실제로 할당되었는지 알아보는 함수중에서
BSD 라이브러리 함수중에는 malloc_size()이라는 것이 있네요.

#include <stdlib.h>
#include <malloc/malloc.h>
#include <stdio.h>

void allocprint (size_t size)
{
    void *memory;

    memory = malloc (size);
    printf ("malloc(%ld) has a block size of %ld\n", size, malloc_size(memory));
}

int main (int argc, char *argv[])
{
    allocprint (1);
    allocprint (sizeof(double));
    allocprint (14);
    allocprint (16);
    allocprint (32);
    allocprint (48);
    allocprint (64);
    allocprint (100);
    exit (0);
}

위의 코드를 제 pc에서 실행한 결과는 다음과 같습니다.

malloc(1) has a block size of 16
malloc(8) has a block size of 16
malloc(14) has a block size of 16
malloc(16) has a block size of 16
malloc(32) has a block size of 32
malloc(48) has a block size of 48
malloc(64) has a block size of 64
malloc(100) has a block size of 112

위의 코드는 Advanced Mac OS X Programming 이라는 책에서 참고했습니다.

익명 사용자의 이미지

* malloc()은 유닉스/리눅스의 시스템 호출 brk() 및 mmap()을 wrapping한 C 함수입니다. 즉, brk()로 할당받고, 이를 특정 자료구조로 관리합니다. 자료구조는 시스템별로 구현에 따라 상이합니다. 여기까지는 위에서 여러 논객들이 논의한 바이고, 한번에 할당되는 메모리 양은 (관리구조를 위한 크기+사용자요청크기)가 되겠습니다.

* glibc의 경우는 제가 한번 해본적이 있습니다만, glibc버전에 따라 상이할 것으로 보입니다.

* 다음 URL을 참고해 보세요.
http://www-128.ibm.com/developerworks/kr/library/l-memory
- 영문 문서를 번역해 놓은 것입니다.(물론 제가 안했음 ^^;)
- 이 곳에서 취한 방법은 glibc하고 1바이트정도 차이가 나던데....

* 그외 memory leak debug등의 검색어로 검색하면 좋은 정보 많이 찾으실듯.

mykhs7200의 이미지

size of 을 이용해서 필요한 함수에 사이즈를 출력하면 될듯 싶습니다.

sangwoo의 이미지

jsunam wrote:
malloc()으로 얼마나 많은 메모리가 실제로 할당되었는지 알아보는 함수중에서
BSD 라이브러리 함수중에는 malloc_size()이라는 것이 있네요.

참고로, FreeBSD에는 이런 함수가 없습니다.

----
Let's shut up and code.

익명 사용자의 이미지

sangwoo wrote:
jsunam wrote:
malloc()으로 얼마나 많은 메모리가 실제로 할당되었는지 알아보는 함수중에서
BSD 라이브러리 함수중에는 malloc_size()이라는 것이 있네요.

참고로, FreeBSD에는 이런 함수가 없습니다.

google에서 malloc_size를 검색해보면 최상단에 malloc_isze에 대한 man page가 검색이 되는데 이 녀석이 Mac OS X 의 man page인데 상단에 BSD Library Functions Manual 이라고 되어 있습니다.
그래서 jsunam님이 착각하신듯 합니다.
그리고 또 재밌는 것은 Darwin man page를 검색해보면 그곳에는 또 FreeBSD Library Functions Manual 이라고 뜨네요 :)
pynoos의 이미지

제 졸문이 하나 있습니다만, 도움이 되실것 같습니다.

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

댓글 달기

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