malloc(3) - wariua/manpages-ko GitHub Wiki

NAME

malloc, free, calloc, realloc - ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹นํ•˜๊ณ  ํ•ด์ œํ•˜๊ธฐ

SYNOPSIS

#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

DESCRIPTION

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์œผ๋กœ ์„ค์ •ํ•˜๋ฉฐ, ์›๋ž˜ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์„ ๊ทธ๋Œ€๋กœ ๋‚จ๊ฒจ๋‘”๋‹ค.

RETURN VALUE

malloc() ๋ฐ calloc() ํ•จ์ˆ˜๋Š” ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์–ด๋–ค ๋‚ด์žฅ ํƒ€์ž…์—๋„ ์ ํ•ฉํ•˜๋„๋ก ์ •๋ ฌ๋˜์–ด ์žˆ๋‹ค. ์˜ค๋ฅ˜ ์‹œ ์ด ํ•จ์ˆ˜๋“ค์€ NULL์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. size๊ฐ€ 0์ธ malloc() ์„ฑ๊ณต ํ˜ธ์ถœ์ด, ๋˜๋Š” nmemb๋‚˜ size๊ฐ€ 0์ธ calloc() ์„ฑ๊ณต ํ˜ธ์ถœ์ด NULL์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

free() ํ•จ์ˆ˜๋Š” ์•„๋ฌด ๊ฐ’๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.

realloc() ํ•จ์ˆ˜๋Š” ์ƒˆ๋กœ ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๊ทธ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์–ด๋–ค ๋‚ด์žฅ ํƒ€์ž…์—๋„ ์ ํ•ฉํ•˜๋„๋ก ์ •๋ ฌ๋˜์–ด ์žˆ์œผ๋ฉฐ ptr๊ณผ ๋‹ค๋ฅผ ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์š”์ฒญ์ด ์‹คํŒจํ•œ ๊ฒฝ์šฐ NULL์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. size๊ฐ€ 0์ด๋ฉด NULL์ด๋‚˜ free()์— ์ „๋‹ฌํ•˜๊ธฐ ์ ํ•ฉํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. realloc()์ด ์‹คํŒจํ•œ ๊ฒฝ์šฐ ์›๋ž˜ ๋ธ”๋ก์€ ๋ฐ”๋€Œ์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ์ด๋‹ค. ์ฆ‰, ํ•ด์ œ๋˜๊ฑฐ๋‚˜ ์ด๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค.

์„ฑ๊ณต ์‹œ reallocarray() ํ•จ์ˆ˜๋Š” ์ƒˆ๋กœ ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์‹คํŒจ ์‹œ NULL์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ์›๋ž˜ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์€ ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค.

ERRORS

calloc(), malloc(), realloc(), reallocarray()๊ฐ€ ๋‹ค์Œ ์˜ค๋ฅ˜๋กœ ์‹คํŒจํ•  ์ˆ˜ ์žˆ๋‹ค.

ENOMEM
๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ. ์•„๋งˆ ์‘์šฉ์ด getrlimit(2)์— ๊ธฐ์ˆ ๋œ RLIMIT_AS๋‚˜ RLIMIT_DATA ์ œํ•œ์— ๊ฑธ๋ ธ์„ ๊ฒƒ์ด๋‹ค.

ATTRIBUTES

์ด ์ ˆ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์šฉ์–ด๋“ค์— ๋Œ€ํ•œ ์„ค๋ช…์€ attributes(7)๋ฅผ ๋ณด๋ผ.

์ธํ„ฐํŽ˜์ด์Šค ์†์„ฑ ๊ฐ’
malloc(), free(),
calloc(), realloc()
์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ MT-Safe

CONFORMING TO

malloc(), free(), calloc(), realloc(): POSIX.1-2001, POSIX.1-2008, C89, C99.

reallocarray()๋Š” ๋น„ํ‘œ์ค€ ํ™•์žฅ์ด๋ฉฐ OpenBSD 5.6๊ณผ FreeBSD 11.0์—์„œ ์ฒ˜์Œ ๋“ฑ์žฅํ–ˆ๋‹ค.

NOTES

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฆฌ๋ˆ…์Šค๋Š” ๋‚™์ฒœ์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์ „๋žต์„ ๋”ฐ๋ฅธ๋‹ค. ์ด๋Š” 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)๋ฅผ ๋ณด๋ผ.

SEE ALSO

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

โš ๏ธ **GitHub.com Fallback** โš ๏ธ