RAII(Resource Acquisition Is Initialization)는 C++에서 자원 관리를 안전하게 하기 위한 중요한 디자인 패턴이다.
reference: https://blog.seulgi.kim/2014/01/raii.html
RAII: C++에서 자주 쓰이는 idiom으로 자원의 안전한 사용을 위해 객체가 쓰이는 스코프를 벗어나면 자원을 해제해주는 기법이다. C++에서 heap에 할당된 자원은 명시적으로 해제하지 않으면 해제되지 않지만, stack에 할당된 자원은 자신의 scope가 끝나면 메모리가 해제되며 destructor가 불린다는 원리를 이용한 것이다.
다음 예시 코드를 보면
#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 |