상세 컨텐츠

본문 제목

[C++] RAII 패턴

개발

by 차차승 2024. 12. 20. 10:56

본문

RAII 

RAII(Resource Acquisition Is Initialization) C++에서 자원 관리를 안전하게 하기 위한 중요한 디자인 패턴이다.

 

reference: https://blog.seulgi.kim/2014/01/raii.html
RAII: C++에서 자주 쓰이는 idiom으로 자원의 안전한 사용을 위해 객체가 쓰이는 스코프를 벗어나면 자원을 해제해주는 기법이다. C++에서 heap에 할당된 자원은 명시적으로 해제하지 않으면 해제되지 않지만, stack에 할당된 자원은 자신의 scope가 끝나면 메모리가 해제되며 destructor가 불린다는 원리를 이용한 것이다.

사용이유

  1. 메모리 누수 방지 : 객체가 소멸될 때 자원이 자동으로 해제되므로 메모리 누수를 방지
  2. 예외 안전성 : 예외가 발생해도 stack unwinding 과정에서 해제 됨

 

다음 예시 코드를 보면

#include <iostream>

using namespace std;

bool error(){
    return true;
}

void func(){
    int* c = new int[10000];
//    unique_ptr<int> q(c);
    if(error()) return;
    delete[] c;
}

int main() {
    func();
    cout<<"hi" << endl;
    return 0;
}

 

delete[] c가 되기전에 return 된다.

이렇게 되면 메모리 해제가 안된 상태로 함수가 끝나게 된다. 

하지만 주석을 풀고 unique_ptr<int> q(c)를 사용했을 경우 func() 함수가 return되며 메모리 해제가 된다.

 

또한, 사용자가 메모리 할당과 해제를 직접 해주지 않아도 자동으로 해주는 것을 RAII 패턴이다.

 

멀티스레드 환경에서의 mutex

Lock::Lock(const IMutex& m) : m_mutex(m)
{
    m_mutex.Lock();
}

Lock::~Lock()
{
    m_mutex.Unlock();
}

 

Lock 객체가 생성될 때 IMutex 객체의 참조를 받아 저장하고 즉시 해당 뮤텍스를 잠근다.

하지만 이렇게 lock과 unlock을 쓰는 것은 좋은 것이 아니다.

lock_guard를 사용하는 것이 좋다.

실습코드는 나중에 추가해야겠다.

'개발' 카테고리의 다른 글

[Java] ClassPath로 .jar 파일 사용하기  (0) 2024.12.12
안드로이드 스튜디오 gradle syn 에러  (2) 2024.12.11
인텔리제이에서 JNI 테스트  (0) 2024.12.10

관련글 더보기