๋ฉ๋ชจ๋ฆฌ ๋์(Memory Leak)
๋ฉ๋ชจ๋ฆฌ ๋์๋ ๋์ ํ ๋นํ ๋ค ํด์ ๋ฅผ ํ์ง ์์ ํ๋ก๊ทธ๋จ์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ณ์ ์ ์งํ์ฌ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ถ์กฑํด ๋ฐ์ํ๋ ํ์์ด๋ค. ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๊ณ์๋๋ฉด ๊ฒฐ๊ตญ OOM(Out Of Memory) ํ์์ด ๋ฐ์ํด์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ ์ด์ ๋์ํ์ง ๋ชปํ๊ณ ํ๋ก๊ทธ๋จ(์๋ฐ์์ JVM)์ด ์ข ๋ฃ๋๋ ์ต์ ์ ์ํฉ์ด ๋ฐ์ํ ์ ์๋ค.
1. C++ ํด๊ฒฐ ๋ฐฉ๋ฒ - ์ค๋งํธ ํฌ์ธํฐ(Smart Pointer)
C++์ GC์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฐฉ์์ด ์์ผ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ํด์ ํ๋ฉฐ ๊ด๋ฆฌํด์ผ ํ๋ค. ์ค๋งํธ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ณ ์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค.
- RAII(Resource Acquisition Is Initialization) ํจํด: ์ง์ ๋ฆฌ์์ค ๊ด๋ฆฌ๋ฅผ ํด์ค์ผ ํ๋ ์ธ์ด์์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ๊ธฐ๋ฒ์ผ๋ก ์คํ์ฒ๋ผ ํด๋น ๋ฆฌ์์ค์ ์ฌ์ฉ scope์ด ๋๋ฌ์ ๋ ์๋์ผ๋ก ํด์ ๋ฅผ ํด์ฃผ๋ฉฐ exception์ด ๋ฐ์ํด๋ ํ๋ํ ์์์ด ํด์ ๋จ์ ๋ณด์ฅํ๋ค.
- ํฌ๊ฒ unique_ptr, shared_ptr, weak_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; }
};
void do_something() {
A* a = new A();
// std::make_unique ํจ์๋ฅผ ํตํ unique_ptr ์์ฑ
std::unique_ptr<A> pa(a);
pa->some(); // pa๊ฐ ์์ ํ ์์ ํฌ์ธํฐ์ ๋ฉค๋ฒ์ ์ ๊ทผ
}
int main() { do_something(); }
// ์ถ๋ ฅ
// ์์์ ํ๋ํจ!
// ์ผ๋ฐ ํฌ์ธํฐ์ ๋์ผํ๊ฒ ์ฌ์ฉ๊ฐ๋ฅ!
// ์์์ ํด์ ํจ!
2. JAVA ํด๊ฒฐ ๋ฐฉ๋ฒ - ๊ฐ๋น์ง ์ฝ๋ ํฐ(Garbage Collector)
GC๋ ํ๋ก๊ทธ๋จ์์ ๋ ์ด์ ์ฐ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ์ฐพ์์ ๊ฐ์ ธ๊ฐ๋ ๊ฒ์ผ๋ก Heap ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌํ์ฉํ๊ธฐ ์ํด ์ฐธ์กฐ๋์ง ์์ ๊ฐ์ฒด๋ค์ ํด์ ์์ผ ๊ฐ์ฉํ ๊ณต๊ฐ์ ๋ง๋ ๋ค.
- ์ฅ์ : ์ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๋ฆฌํ์ง ์์๋ ๋๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ ์๋๊ฐ ํฅ์๋ ์ ์๋ค.
- ๋จ์ : ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ธ์ ๋์ฐพ์์ฌ์ง ๊ฒฐ์ ํ๊ธฐ ์ํ ์ค๋ฒํค๋ ๋๋ฌธ์ ๋๋ฆฌ๋ค.
3. ์คํ ์ค๋ฒ ํ๋ก์ฐ(Stack Over flow)
ํ๋ก๊ทธ๋จ์ด ์ด์ฉ ๊ฐ๋ฅํ ์คํ ๊ณต๊ฐ์ ์ด์์ ์ฌ์ฉํ๋ ค๊ณ ํ ๋ ๋ฐ์ํ๋ค. ์๋ฅผ ๋ค์ด ํจ์๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๊ณ์ ํธ์ถํ๋ฉด ๋ฐ์ดํฐ๋ ์คํ์ ๊ณ์ ์์ด๊ฒ ๋๋๋ฐ ์คํ ๋ฉ๋ชจ๋ฆฌ์ ์์ญ์ ๋์ด์๋ฉด ์คํ ์ค๋ฒ ํ๋ก์ฐ๊ฐ ๋ฐ์ํ๋ค.
- C#์ ์คํ ์ค๋ฒ ํ๋ก์ฐ๋ก ์ธํ ์์ธ ์ฒ๋ฆฌ๊ฐ ์กด์ฌํ๋ค.
- C++์ ์์ธ ์ฒ๋ฆฌ๊ฐ ์์ด์ ์ํฉ์ ๋ฐ๋ผ ์ค๋ฅ๊ฐ ๊ฐ์ง๋์ง ์์ ์ ์๋ค. ๊ฐ์ง๋์ง ์์ผ๋ฉด ์ด๊ณผ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฎ์ด์ฐ๋ ค๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.