๋ฉ๋ชจ๋ฆฌ ๋์(Memory Leak)
๋ฉ๋ชจ๋ฆฌ ๋์๋ ๋์ ํ ๋นํ ๋ค ํด์ ๋ฅผ ํ์ง ์์ ํ๋ก๊ทธ๋จ์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ณ์ ์ ์งํ์ฌ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด ๋ฐ์ํ๋ ํ์์ด๋ค. ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๊ณ์๋๋ฉด ๊ฒฐ๊ตญ OOM(Out Of Memory) ํ์์ด ๋ฐ์ํด์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ ์ด์ ๋์ํ์ง ๋ชปํ๊ณ ํ๋ก๊ทธ๋จ(์๋ฐ JVM)์ด ์ข ๋ฃ๋๋ ์ต์ ์ ์ํฉ์ด ๋ฐ์ํ ์ ์๋ค.
1. C++
1) RAII(Resource Acquisition Is Initialization)
RAII์ ์ง์ ๋ฆฌ์์ค ๊ด๋ฆฌ๋ฅผ ํด์ค์ผ ํ๋ ์ธ์ด์์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ์ค๊ณ ํจํด์ด๋ค. ํด๋น ๋ฆฌ์์ค์ ์ฌ์ฉ์ด ๋๋ฌ์ ๋ ์๋์ผ๋ก ํด์ ๋ฅผ ํด์ฃผ๋ฉฐ exception์ด ๋ฐ์ํด๋ ํ๋ํ ์์์ด ํด์ ๋จ์ ๋ณด์ฅํ๋ค.
2) ์ค๋งํธ ํฌ์ธํฐ(Smart Pointer)
C++์ RAII๋ ์ค๋งํธ ํฌ์ธํฐ์ด๋ค.
- unique_ptr: ํ๋์ ์ค๋ธ์ ํธ(๋ฉ๋ชจ๋ฆฌ ์์ญ)๋ฅผ ๋จ ํ๋์ ํฌ์ธํฐ๋ง ๊ฐ๋ฆฌํค๊ฒ ํ๋ค.
#include <iostream>
class A {
int* data;
public:
A() {
std::cout << "์์์ ํ๋ํจ!" << std::endl;
data = new int[100];
}
~A() {
std::cout << "์์์ ํด์ ํจ!" << std::endl;
delete[] data;
}
void some() { std::cout << "์ผ๋ฐ ํฌ์ธํฐ์ ๋์ผํ๊ฒ ์ฌ์ฉ๊ฐ๋ฅ!" << std::endl; }
};
int main() {
A* a = new A();
std::unique_ptr<A> ptr(a);
ptr->some();
}
// ์์์ ํ๋ํจ!
// ์ผ๋ฐ ํฌ์ธํฐ์ ๋์ผํ๊ฒ ์ฌ์ฉ๊ฐ๋ฅ!
// ์์์ ํด์ ํจ!
- shared_ptr: ๊ฐ์ ์ค๋ธ์ ํธ(๋ฉ๋ชจ๋ฆฌ ์์ญ)๋ฅผ ๋์์ ์ฐธ์กฐ๊ฐ ๊ฐ๋ฅํ๋ค. ์ด๋ ์ฐธ์กฐ ๊ฐ์๋ฅผ ๋ช ๋ช ํ๊ณ ๊ด๋ฆฌํ๋๋ฐ, ์ด ๊ฐ์๊ฐ 0์ด๋ผ๋ฉด ํด์ ํ๋ ๋ฐฉ์์ด๋ค.
- weak_ptr: shared_ptr์ reference counter๋ฅผ ์ฆ๊ฐ์ํค์ง ์๋๋ค.
2. JAVA, C#
1) ๊ฐ๋น์ง ์ฝ๋ ํฐ(Garbage Collector)
GC๋ ํ๋ก๊ทธ๋จ์์ ๋ ์ด์ ์ฐ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ์ฐพ์์ ๊ฐ์ ธ๊ฐ๋ ๊ฒ์ผ๋ก Heap ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌํ์ฉํ๊ธฐ ์ํด ์ฐธ์กฐ๋์ง ์์ ๊ฐ์ฒด๋ค์ ํด์ ์์ผ ๊ฐ์ฉํ ๊ณต๊ฐ์ ๋ง๋ ๋ค.
- ์ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๋ฆฌํ์ง ์์๋ ๋๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ ์๋๊ฐ ํฅ์๋ ์ ์๋ค.
- ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ธ์ ๋์ฐพ์์ฌ์ง ๊ฒฐ์ ํ๊ธฐ ์ํ ์ค๋ฒํค๋ ๋๋ฌธ์ ๋๋ฆฌ๋ค.
3. ์คํ์ค๋ฒํ๋ก์ฐ(StackOverflow)
ํ๋ก๊ทธ๋จ์ด ์ด์ฉ ๊ฐ๋ฅํ ์คํ ๊ณต๊ฐ์ ์ด์์ ์ฌ์ฉํ๋ ค๊ณ ํ ๋ ๋ฐ์ํ๋ค. ์๋ฅผ ๋ค์ด ํจ์๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๊ณ์ ํธ์ถํ๋ฉด ๋ฐ์ดํฐ๋ ์คํ์ ๊ณ์ ์์ด๊ฒ ๋๋๋ฐ ์คํ ๋ฉ๋ชจ๋ฆฌ์ ์์ญ์ ๋์ด์๋ฉด ์คํ ์ค๋ฒ ํ๋ก์ฐ๊ฐ ๋ฐ์ํ๋ค.
- C#์ ์คํ ์ค๋ฒ ํ๋ก์ฐ๋ก ์ธํ ์์ธ ์ฒ๋ฆฌ๊ฐ ์กด์ฌํ๋ค.
- C++์ ์์ธ ์ฒ๋ฆฌ๊ฐ ์์ด์ ์ํฉ์ ๋ฐ๋ผ ์ค๋ฅ๊ฐ ๊ฐ์ง๋์ง ์์ ์ ์๋ค. ๊ฐ์ง๋์ง ์์ผ๋ฉด ์ด๊ณผ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฎ์ด์ฐ๋ ค๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.