malloc(3) - wariua/manpages-ko GitHub Wiki
malloc, free, calloc, realloc - ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋นํ๊ณ ํด์ ํ๊ธฐ
#include <stdlib.h>
void *malloc(size_t size);
void free(void *ptr);
void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);
void *reallocarray(void *ptr, size_t nmemb, size_t size);
glibc ๊ธฐ๋ฅ ํ์ธ ๋งคํฌ๋ก ์๊ฑด (feature_test_macros(7) ์ฐธ๊ณ ):
-
reallocarray()
: -
- glibc 2.29๋ถํฐ:
_DEFAULT_SOURCE
- glibc 2.28 ๋ฐ ์ด์ :
_GNU_SOURCE
malloc()
ํจ์๋ size
๋ฐ์ดํธ๋ฅผ ํ ๋นํ์ฌ ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ค. ๊ทธ ๋ฉ๋ชจ๋ฆฌ๋ ์ด๊ธฐํ ๋์ด ์์ง ์๋ค. size
๊ฐ 0์ด๋ฉด malloc()
์ NULL์ ๋ฐํํ๊ฑฐ๋, ์ดํ free()
์ ๋ฌด์ฌํ ์ ๋ฌํ ์ ์๋ ๊ณ ์ ํ ํฌ์ธํฐ ๊ฐ์ ๋ฐํํ๋ค.
free()
ํจ์๋ ptr
์ด ๊ฐ๋ฆฌํค๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํด์ ํ๋๋ฐ ptr
์ ์ด์ ์ malloc()
, calloc()
, realloc()
ํธ์ถ์ด ๋ฐํํ ๊ฒ์ด์ด์ผ ํ๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด, ๋๋ ์ด๋ฏธ free(ptr)
์ ํธ์ถํ์ผ๋ฉด ๊ท์ ๋์ด ์์ง ์์ ๋์์ด ์ผ์ด๋๋ค. ptr
์ด NULL์ด๋ฉด ์ด๋ค ๋์๋ ์ํํ์ง ์๋๋ค.
calloc()
ํจ์๋ ๊ฐ size
๋ฐ์ดํธ์ธ ์์ nmemb
๊ฐ์ ๋ฐฐ์ด์ ์ํ ๋ฐฐ์ด์ ํ ๋นํ์ฌ ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ค. ๊ทธ ๋ฉ๋ชจ๋ฆฌ๋ 0์ผ๋ก ์ฑ์์ ธ ์๋ค. nmemb
๋ size
๊ฐ 0์ด๋ฉด calloc()
์ NULL์ ๋ฐํํ๊ฑฐ๋, ์ดํ free()
์ ๋ฌด์ฌํ ์ ๋ฌํ ์ ์๋ ๊ณ ์ ํ ํฌ์ธํฐ ๊ฐ์ ๋ฐํํ๋ค. nmemb
์ size
์ ๊ณฑ์ด ์ ์ ์ค๋ฒํ๋ก์ฐ๋ฅผ ์ผ์ผํฌ ๊ฒฝ์ฐ calloc()
์ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ค. ๋ฐ๋ฉด ๋ค์ malloc()
ํธ์ถ์ ์ ์ ์ค๋ฒํ๋ก์ฐ๋ฅผ ํ์งํ์ง ์์ผ๋ฉฐ, ๊ทธ๋์ ์๋ชป๋ ํฌ๊ธฐ์ ๋ธ๋ก์ด ํ ๋น๋๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์ ์ ์๋ค.
malloc(nmemb * size);
realloc()
ํจ์๋ ptr
์ด ๊ฐ๋ฆฌํค๋ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ํฌ๊ธฐ๋ฅผ size
๋ฐ์ดํธ๋ก ๋ฐ๊พผ๋ค. ์์์ ๋ถํฐ ์ด์ ํฌ๊ธฐ์ ์ ํฌ๊ธฐ ์ค ์์ ๊ฐ๊น์ง์ ๋ฒ์์์๋ ๋ด์ฉ๋ฌผ์ด ๋ฐ๋์ง ์๋๋ค. ์ ํฌ๊ธฐ๊ฐ ์ด์ ํฌ๊ธฐ๋ณด๋ค ํฐ ๊ฒฝ์ฐ ์ถ๊ฐ๋๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ด๊ธฐํ ๋์ง ์๋๋ค. ptr
์ด NULL์ด๋ฉด ๊ทธ ํธ์ถ์ ๋ชจ๋ size
๊ฐ์ ๋ํด malloc(size)
์ ๋๋ฑํ๋ค. size
๊ฐ 0์ด๊ณ ptr
์ด NULL์ด ์๋๋ฉด ๊ทธ ํธ์ถ์ free(ptr)
๊ณผ ๋๋ฑํ๋ค. ptr
์ด NULL์ด ์๋๋ผ๋ฉด ๊ทธ ๊ฐ์ ์ด์ ์ malloc()
, calloc()
, realloc()
ํธ์ถ์ด ๋ฐํํ ๊ฒ์ด์ด์ผ ํ๋ค. ๊ฐ๋ฆฌํค๋ ์์ญ์ด ์ฎ๊ฒจ์ง๋ ๊ฒฝ์ฐ free(ptr)
๋ฅผ ํ๋ค.
reallocarray()
ํจ์๋ ptr
์ด ๊ฐ๋ฆฌํค๋ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ํฌ๊ธฐ๋ฅผ ๊ฐ size
๋ฐ์ดํธ์ธ ์์ nmemb
๊ฐ์ ๋ฐฐ์ด์ ์ถฉ๋ถํ๋๋ก ๋ฐ๊พผ๋ค. ๋ค์ ํธ์ถ๊ณผ ๋๋ฑํ๋ค.
realloc(ptr, nmemb * size);
ํ์ง๋ง realloc()
ํธ์ถ๊ณผ ๋ฌ๋ฆฌ reallocarray()
๋ ๊ณฑ์
์ด ๋์น๊ฒ ๋ ๊ฒฝ์ฐ์ ์์ ํ๊ฒ ์คํจํ๋ค. ๊ทธ๋ฐ ์ค๋ฒํ๋ก์ฐ๊ฐ ์ผ์ด๋๋ ๊ฒฝ์ฐ reallocarray()
๋ NULL์ ๋ฐํํ๊ณ errno
๋ฅผ ENOMEM
์ผ๋ก ์ค์ ํ๋ฉฐ, ์๋ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ๊ทธ๋๋ก ๋จ๊ฒจ๋๋ค.
malloc()
๋ฐ calloc()
ํจ์๋ ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ค. ๊ทธ ๋ฉ๋ชจ๋ฆฌ๋ ์ด๋ค ๋ด์ฅ ํ์
์๋ ์ ํฉํ๋๋ก ์ ๋ ฌ๋์ด ์๋ค. ์ค๋ฅ ์ ์ด ํจ์๋ค์ NULL์ ๋ฐํํ๋ค. size
๊ฐ 0์ธ malloc()
์ฑ๊ณต ํธ์ถ์ด, ๋๋ nmemb
๋ size
๊ฐ 0์ธ calloc()
์ฑ๊ณต ํธ์ถ์ด NULL์ ๋ฐํํ ์๋ ์๋ค.
free()
ํจ์๋ ์๋ฌด ๊ฐ๋ ๋ฐํํ์ง ์๋๋ค.
realloc()
ํจ์๋ ์๋ก ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ค. ๊ทธ ๋ฉ๋ชจ๋ฆฌ๋ ์ด๋ค ๋ด์ฅ ํ์
์๋ ์ ํฉํ๋๋ก ์ ๋ ฌ๋์ด ์์ผ๋ฉฐ ptr
๊ณผ ๋ค๋ฅผ ์๋ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์์ฒญ์ด ์คํจํ ๊ฒฝ์ฐ NULL์ ๋ฐํํ๋ค. size
๊ฐ 0์ด๋ฉด NULL์ด๋ free()
์ ์ ๋ฌํ๊ธฐ ์ ํฉํ ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ค. realloc()
์ด ์คํจํ ๊ฒฝ์ฐ ์๋ ๋ธ๋ก์ ๋ฐ๋์ง ์๊ณ ๊ทธ๋๋ก์ด๋ค. ์ฆ, ํด์ ๋๊ฑฐ๋ ์ด๋ํ์ง ์๋๋ค.
์ฑ๊ณต ์ reallocarray()
ํจ์๋ ์๋ก ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ค. ์คํจ ์ NULL์ ๋ฐํํ๋ฉฐ ์๋ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ๋ฐ๋์ง ์๋๋ค.
calloc()
, malloc()
, realloc()
, reallocarray()
๊ฐ ๋ค์ ์ค๋ฅ๋ก ์คํจํ ์ ์๋ค.
ENOMEM
- ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ. ์๋ง ์์ฉ์ด getrlimit(2)์ ๊ธฐ์ ๋
RLIMIT_AS
๋RLIMIT_DATA
์ ํ์ ๊ฑธ๋ ธ์ ๊ฒ์ด๋ค.
์ด ์ ์์ ์ฌ์ฉํ๋ ์ฉ์ด๋ค์ ๋ํ ์ค๋ช ์ attributes(7)๋ฅผ ๋ณด๋ผ.
์ธํฐํ์ด์ค | ์์ฑ | ๊ฐ |
---|---|---|
malloc() , free() ,calloc() , realloc()
|
์ค๋ ๋ ์์ ์ฑ | MT-Safe |
malloc()
, free()
, calloc()
, realloc()
: POSIX.1-2001, POSIX.1-2008, C89, C99.
reallocarray()
๋ ๋นํ์ค ํ์ฅ์ด๋ฉฐ OpenBSD 5.6๊ณผ FreeBSD 11.0์์ ์ฒ์ ๋ฑ์ฅํ๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ๋ฆฌ๋
์ค๋ ๋์ฒ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์ ๋ต์ ๋ฐ๋ฅธ๋ค. ์ด๋ malloc()
์ด NULL ์๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ๋ ๊ทธ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค๋ ๋ณด์ฅ์ด ์๋ค๋ ๋ป์ด๋ค. ์์คํ
์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํ๋ค๊ณ ํ๋ช
๋๋ ๊ฒฝ์ฐ OOM ํฌ๋ฌ์ ์ํด ํ ๊ฐ ์ด์์ ํ๋ก์ธ์ค๊ฐ ์ฃฝ๊ฒ ๋๋ค. ๋ ๋ง์ ์ ๋ณด๋ proc(5)์ /proc/sys/vm/overcommit_memory
๋ฐ /proc/sys/vm/oom_adj
์ค๋ช
๊ณผ ๋ฆฌ๋
์ค ์ปค๋ ์์ค ํ์ผ์ Documentation/vm/overcommit-accounting.rst
๋ฅผ ๋ณด๋ผ.
๋ณดํต์ malloc()
์ด ํ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ฉฐ sbrk(2)๋ฅผ ์ด์ฉํด ํ์ํ ๋งํผ ํ์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ค. MMAP_THRESHOLD
๋ณด๋ค ํฐ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ํ ๋นํ ๋ glibc์ malloc()
๊ตฌํ์ mmap(2)์ ์ด์ฉํด ๋น๊ณต์ ์ต๋ช
๋งคํ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ค. MMAP_THRESHOLD
๋ ๊ธฐ๋ณธ์ ์ผ๋ก 128kB์ด๊ณ mallopt(3)๋ก ์กฐ์ ๊ฐ๋ฅํ๋ค. ๋ฆฌ๋
์ค 4.7 ์ ์์๋ mmap(2)์ผ๋ก ์ํํ๋ ํ ๋น์ด RLIMIT_DATA
์์ ์ ํ์ ์ํฅ์ ๋ฐ์ง ์์๋ค. ๋ฆฌ๋
์ค 4.7๋ถํฐ๋ mmap(2)์ผ๋ก ์ํํ๋ ํ ๋น์๋ ์ด ์ ํ์ด ์ ์ฉ๋๋ค.
๋ค์ค ์ค๋ ๋ ์์ฉ์์์ ์ค์ผ์ ๋ง๊ธฐ ์ํด ๋ด๋ถ์ ์ผ๋ก ๋ฎคํ ์ค๋ฅผ ์ฌ์ฉํด์ ์ด ํจ์๋ค์ด ์ด์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์๋ฃ ๊ตฌ์กฐ๋ค์ ๋ณดํธํ๋ค. ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น ๋ฐ ํด์ ํ๋ ๋ค์ค ์ค๋ ๋ ์์ฉ์์๋ ์ด ๋ฎคํ ์ค๋ค์ ๋ํ ๊ฒฝ์์ด ์์ ์ ์์ ๊ฒ์ด๋ค. ๋ค์ค ์ค๋ ๋ ์์ฉ์์์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ํ์ฅ์ฑ ์๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด glibc์์๋ ๋ฎคํ ์ค ๊ฒฝ์์ ํ์งํ๋ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์๋ ๋(arena)๋ฅผ ์ถ๊ฐ๋ก ๋ง๋ ๋ค. ๊ฐ ์๋ ๋๋ ์์คํ ์ด ๋ด๋ถ์ ์ผ๋ก (brk(2)๋ mmap(2)์ผ๋ก) ํ ๋นํด์ ๋ณ๋์ ๋ฎคํ ์ค๋ก ๊ด๋ฆฌํ๋ ์ปค๋ค๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด๋ค.
SUSv2์์๋ malloc()
, calloc()
, realloc()
์ด ์คํจ ์์ errno
๋ฅผ ENOMEM
์ผ๋ก ์ค์ ํ๊ธฐ๋ฅผ ์๊ตฌํ๋ค. glibc์์๋ ์ด๋ฅผ ๊ฐ์ ํ๋ค. (๊ทธ๋ฆฌ๊ณ ์ด ๋ฃจํด๋ค์ glibc ๋ฒ์ ์ ๊ทธ๋ ๊ฒ ๋์ํ๋ค.) errno
๋ฅผ ์ค์ ํ์ง ์๋ ์์ฒด malloc ๊ตฌํ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์ ํน์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฃจํด๋ค์ด ์คํจํ๋ฉด์ errno
์ ์ด์ ๋ฅผ ์ฃผ์ง ์์ ์๋ ์๋ค.
malloc()
, calloc()
, realloc()
, free()
์์์ ์ฃฝ๋ ๊ฒ์ ๊ฑฐ์ ์ธ์ ๋ ํ ๋น ์์ญ์ ๋๊ฒจ ์ ๊ทผํ๊ฑฐ๋ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ๋ ๋ฒ ํด์ ํ๋ ๊ฒ ๊ฐ์ ํ ์ค์ผ๊ณผ ๊ด๋ จ๋ผ ์๋ค.
ํ๊ฒฝ ๋ณ์๋ฅผ ํตํด malloc()
๊ตฌํ์ ํ๋ ํ ์ ์๋ค. ์์ธํ ๋ด์ฉ์ mallopt(3)๋ฅผ ๋ณด๋ผ.
valgrind(1), brk(2), mmap(2), alloca(3), malloc_get_state(3), malloc_info(3), malloc_trim(3), malloc_usable_size(3), mallopt(3), mcheck(3), mtrace(3), posix_memalign(3)
GNU C ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ตฌํ์ ๋ํ ์์ธํ ๋ด์ฉ์ https://sourceware.org/glibc/wiki/MallocInternals ์ฐธ๊ณ .
2019-03-06