๏ธ ๊ฒฐ๋ก (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
๋ณต์ฌ
-๋-