Search
Duplicate
๐ŸšŒ

๐ŸŒธย Memory Leak (๋ฉ”๋ชจ๋ฆฌ ๋ฆญ, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜)๋ž€?

๊ฐ„๋‹จ์†Œ๊ฐœ
memory leak์˜ ์ •์˜์™€ ์˜ˆ๋ฐฉ๋ฒ•
ํŒ”๋งŒ์ฝ”๋”ฉ๊ฒฝ ์ปจํŠธ๋ฆฌ๋ทฐํ„ฐ
ContributorNotionAccount
์ฃผ์ œ / ๋ถ„๋ฅ˜
C
Scrap
ํƒœ๊ทธ
c์–ธ์–ด
๋ฉ”๋ชจ๋ฆฌ๋ˆ„์ˆ˜
memory leak
9 more properties
๏ธŽ ๊ฒฐ๋ก  (summary)
Memory Leak์ด๋ž€?
โ€œ๋™์ ์œผ๋กœ ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ free(ํ• ๋‹น ํ•ด์ œ)๋  ์ˆ˜ ์—†๋Š” ์ƒํƒœ๊ฐ€ ๋œ ๊ฒƒ.โ€
(๊ฐœ๋ฐœ์ž๊ฐ€ ๋™์ ์œผ๋กœ ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ freeํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ๋กœ ๋งŒ๋“  ๊ฒƒ)
Memory Leak, ๋ฌด์—‡์ด ๋ฌธ์ œ์ธ๊ฐ€?
์‹ค๋ฌด์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž์ฃผ, ๋งŽ์ด ํ• ๋‹นํ•œ๋‹จ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ด ์‚ฌ์šฉํ•œ ๋’ค ํ•ด์ œ๋ฅผ ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๊ณ„์† ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋˜๊ณ , ๊ฒฐ๊ตญ ์‹œ์Šคํ…œ์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•ด์ ธ ์šด์˜์ฒด์ œ๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐ•์ œ๋กœ ์ข…๋ฃŒ์‹œํ‚ค๊ฑฐ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์— ์‹คํŒจํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๏ธŽ ์ƒ์„ธ
Memory Leak ๋Œ€ํ‘œ์  ์˜ˆ์‹œ
char *a = malloc(20); // ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ a์— ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น char *b = malloc(10); // ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ b์— ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น b = a; // b๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ์ฃผ์†Œ๊ฐ’์„ a์— ํ• ๋‹น free(a); // ํฌ์ธํ„ฐ a์— ํ• ๋‹นํ•œ 20๋ฐ”์ดํŠธ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œ free(b); // ํฌ์ธํ„ฐ b์— ํ• ๋‹นํ•œ 10๋ฐ”์ดํŠธ์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์•„๋‹Œ a์— ํ• ๋‹นํ•œ 20๋ฐ”์ดํŠธ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ // ํฌ์ธํ„ฐ b์— ํ• ๋‹นํ–ˆ๋˜ 10๋ฐ”์ดํŠธ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น ํ•ด์ œ ๋  ์ˆ˜ ์—†๋Š” ์ƒํƒœ๊ฐ€ ๋จ(memory leak ๋ฐœ์ƒ)
C
๋ณต์‚ฌ
๊ฐœ๋ฐœ์ž๊ฐ€ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ b์— 10๋ฐ”์ดํŠธ ๋ถ„๋Ÿ‰์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ด๋†“๊ณ ์„œ๋Š” ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ b์—๋‹ค๊ฐ€ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ a์— ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์†Œ๋ฅผ ํ• ๋‹นํ–ˆ์œผ๋‹ˆ, ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ b๋Š” ๋”์ด์ƒ 10๋ฐ”์ดํŠธ์งœ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š๊ณ  ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ a์™€ ํ•จ๊ป˜ 20๋ฐ”์ดํŠธ์งœ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ƒํƒœ๋‹ค.
์ด์— ๋”ฐ๋ผ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ b์— ํ• ๋‹นํ–ˆ๋˜ 10๋ฐ”์ดํŠธ ๋ถ„๋Ÿ‰์˜ ๋ฉ”๋ชจ๋ฆฌ๋Š” free(ํ• ๋‹นํ•ด์ œ)ํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ๊ฐ€ ๋๋‹ค. (memory leak)
์ด๋ฅผ ๋„์‹ํ™” ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
free(b)๋ฅผ ํ•ด๋ดค์ž 10๋ฐ”์ดํŠธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•  ์ˆ˜ ์—†๋‹ค.
Memory Leak ์ด๋Ÿฐ์ €๋Ÿฐ ์˜ˆ์‹œ
โ€ข
๋™์  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•œ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๋กœ ํฌ์ธํ„ฐ ์—ฐ์‚ฐ(e.g. ๋ฐ˜๋ณต๋ฌธ)์„ ํ•˜์—ฌ ๋™์  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ์˜ ์‹œ์ž‘์ฃผ์†Œ๊ฐ’์ด ์•„๋‹Œ ์ƒํƒœ์—์„œ free๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ.
c_ptr = malloc(10); if (c_ptr == 0) return (-1); while (*c_ptr) { c_ptr++; } free(c_ptr);
C
๋ณต์‚ฌ
โ€ข
๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ๋ฐ›์€ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜๊ฐ€ free๋˜์ง€ ์•Š์€ ์ฑ„ ์„ ์–ธ๋œ ๋ธ”๋ก({ })์„ ๋ฒ—์–ด๋‚œ ๊ฒฝ์šฐ
โ€ข
ํ”„๋กœ๊ทธ๋žจ์ด ์ •์ƒ์ข…๋ฃŒ๋˜๊ธฐ ์ „์— free(ํ• ๋‹น ํ•ด์ œ)๋ฅผ ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
โ€ข
ํ”„๋กœ๊ทธ๋žจ์ด ์—๋Ÿฌ์— ๋”ฐ๋ฅธ ์ข…๋ฃŒ(์˜ˆ: writeํ•จ์ˆ˜ ์—๋Ÿฌ๋กœ ์ธํ•œ ์ข…๋ฃŒ) ์— ๋Œ€๋น„ํ•˜์—ฌ ์ข…๋ฃŒ ์ „ free(ํ• ๋‹น ํ•ด์ œ) ์กฐ์น˜๋ฅผ ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ
โ€ข
ํ• ๋‹น ํ•ด์ œ๋ฅผ ํ•˜๋Š” ์ค‘๊ฐ„์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ
Memory Leak ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ์Šต๊ด€
โ€ข
malloc์ด๋‚˜ calloc ํ•จ์ˆ˜๋ฅผ ์“ฐ๋ฉด ๋ฐ”๋กœ free๋ฅผ ์จ๋†“๊ณ  ์ฝ”๋”ฉ์„ ์ด์–ด๊ฐ„๋‹ค.
char *str = (char*)malloc(n * sizeof(char)); // ์ฝ”๋“œ free(str);
C
๋ณต์‚ฌ
โ€ข
๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์ฝ”๋”ฉ์— ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์ž„์‹œํฌ์ธํ„ฐ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•œ๋‹ค.
int *ptr = (int*)malloc(sizeof(int)); int *temp = ptr; free(ptr);
C
๋ณต์‚ฌ
โ€ข
๋™์  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•œ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์˜ค๋ฅ˜๋‚˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋กœ ๋ฐ”๋กœ ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ๋ฅผ ์‹œํ‚ค๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ return ์ „์— ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ freeํ•ด์ฃผ๋Š” ๊ฒƒ ์žŠ์ง€ ์•Š๊ธฐ.
if (wirte(1, "42seoul", 7) == -1) { free(๋ฉ”๋ชจ๋ฆฌ); return; }
C
๋ณต์‚ฌ
-๋-