raii
-
[C++] Smart Pointer Intro (스마트 포인터)2021.08.22
[C++] Smart Pointer Intro (스마트 포인터)
우리는 동적 할당을 Type* ptr = new Type;과 같이 선언하였다. 동적 할당을 할 때 가장 신경 써야 할 부분은 바로 Memory Leak (메모리 누수)이다. 왜냐하면 동적으로 할당된 메모리는 delete키워드를 통해 해제시켜줘야 한다는 단점이 있기 때문이고 우리는 delete를 까먹게 되는 경우가 많다. 이를 해소하기 위해 C++11부터 Smart Pointer을 이용하여 자동적으로 메모리 해제를 해주는 기능이 나왔다.
C++ 에는 RAII (Resouce Acquisition Is Initialization)이 있다. RAII가 생긴 이유는 타 언어들과 다르게 GC (garbage collector)가 존재하지 않기 때문이다 (있기는 하나 사용을 안 한다). 우리가 결국 원하는 건 메모리 누수가 나지 않는 것인데 RAII를 통하여 얻을 수 있다. 결국 RAII란 자원의 안전한 사용을 위해서 scpoe가 끝나면 메모리 해제를 해주는 기법이다.
Smart Pointer (스마트 포인터)
Memory Leak은 정말 짜증 나는 경우이다. 아무 생각 없이 동적 할당을 난발하면 메모리 릭이 발생하는데 나중에 어디서 메모리 릭이 발생하는 건지 찾고 수정하는 데에 시간이 오래 걸린다. 이를 해소하기 위해 Smart Pointer가 등장했다.
Smart Pointer를 선언하는 방법은 아래 코드와 같다.
#include <iostream>
#include <memory>
class Dog
{
public:
Dog(int age) : mAge{ age }
{
std::cout << "Dog constructor" << std::endl;
}
~Dog()
{
std::cout << "Dog destructor" << std::endl;
}
private:
int mAge;
};
int main()
{
std::unique_ptr<Dog> dogPtr = std::make_unique<Dog>(9);
return 0;
}
스마트 포인터를 사용하기 위해서는 <memory> 헤더를 include를 시켜주어야 한다. 그다음 main함수 첫 번째 줄과 같이 선언해주면 된다. 위 코드를 돌려보면 자동으로 Comstructor와 Destructor가 불리는 것을 확인할 수 있다.
스마트 포인터는 scope단위로 scope가 끝나면 메모리를 자동으로 해제해준다.
Into이기 때문에 간단하게 설명하고 다른 포스트에서 더 자세하게 다룬다.
Ref.
'Modern C++' 카테고리의 다른 글
[C++] Shared Pointer (쉐어드 포인터) : Circular Reference (순환 참조) (0) | 2021.08.25 |
---|---|
[C++] Smart Pointer (스마트 포인터): Unique Pointer (유니크 포인터) (0) | 2021.08.23 |
[C++] Object Slicing (오브젝트 슬라이싱) (0) | 2021.08.22 |
[C++] Virtual Inheritance (가상 상속) : Diamond Problem (다중 상속 문제) 해결 (0) | 2021.08.21 |
[C++] Multiple Inheritance (다중 상속) (0) | 2021.08.21 |