c++/객체지향

RAII

길자 2025. 11. 30. 12:30
반응형
Resource acquisition is initialization 자원 획득을 초기화 한다.
RAII 는 자원 관리를 위한 c++ 디자인 패턴
스마트 포인터,컨테이너,락 가드 등 모두 RAII 기반
  • 자원 누수를 방지하고 안전한 자원 관리를 보장
  • 생성자에서 자원을 획득하고 소멸자에서 자동으로 자원을 해제한다
  • 코드가 스코프를 벗어날때 자원이 자동으로 정리된다
  • 자원의 획득(alloction) 과 해제(release)를 객체의 생성자.소멸자에 묶는다. 생성자 → 자원 획득(new, 파일열기, 뮤텍스 잠금 등) 소멸자 → 자원 해제(delete,파일닫기,잠금 해제 등) → 이렇게 하면 스코프를 벗어나면 자동으로 소멸자 호출 → 자원 누수 방지

RAII는 언어의 특정 키워드나 내장 기능이라기보다는 C++ 언어의 기본 특성(스코프 기반 변수의 수명 관리 및 소멸자 자동 호출)을 활용한 디자인 패턴

내부 동작 원리: 스택 언와인딩(Stack Unwinding) 및 객체 수명

  1. 객체 생성 및 자원 획득 (생성자):
    • 함수 내에서 RAII 패턴을 따르는 객체(예: std::unique_ptr, std::fstream, std::lock_guard)가 생성될 때, 해당 객체의 생성자가 호출.
    • 이 생성자 내에서 필요한 자원(메모리 할당, 파일 열기, 뮤텍스 잠금 등)을 획득하고, 이 자원을 객체의 멤버 변수로 안전하게 저장.
  2. 스코프 기반 수명 관리 (컴파일러 보장):
    • 이 객체는 일반적으로 스택(Stack) 메모리 영역에 할당 (자동 저장 기간(automatic storage duration) 변수).
    • C++ 컴파일러는 이 스택 객체의 수명을 해당 변수가 선언된 스코프(Scope, {} 블록)에 바인딩.
  3. 자원 해제 (소멸자 및 스택 언와인딩):
    • 코드가 스코프의 끝에 도달하거나, 함수에서 return 될 때, 혹은 예외(Exception)가 발생하여 스택이 해제(Stack Unwinding)될 때, C++ 런타임은 해당 스코프 내의 모든 스택 객체에 대해 소멸자(Destructor)를 자동으로 호출.
    • 스택 언와인딩은 예외가 발생했을 때 적절한 catch 블록을 찾기 위해 호출 스택을 역추적하는 과정이며, 이 과정 중에도 각 스코프의 지역 객체 소멸자는 반드시 호출된다.
    • 소멸자 내에는 자원을 반환하거나 해제하는 코드(예: delete, fclose(), mutex.unlock())가 구현되어 있어, 자원 누수가 발생하지 않는다.

요약: RAII는 컴파일러가 보장하는 객체의 자동 소멸 시점을 활용하여 자원 관리 코드를 실행하는 매우 효율적이고 안전한 컴파일 타임(Compile-time) 패턴입니다.

 

RAII 의 장점

  • (예외 안정성)throw 가 발생해도 스택 언와인딩 → 모든 지역 객체 소멸 → 자원 해제
  • (코드 간결) try / finally 없이도 자원 관리 가능
  • (자동 관리) 수동 delete, clost() 호출 필요 없음
  • unique_ptr, shared_ptr 자체가 RAII

상황 수동 관리 RAII

메모리 new → delete unique_ptr
파일 fopen → fclose std::fstream
뮤텍스 lock() → unlock() std::lock_guard
예외 발생 누수 가능 자동 정리
반응형

'c++ > 객체지향' 카테고리의 다른 글

전위연산자 와 후위연산자의 동작 차이  (0) 2025.11.30
RTTI(Run Time Type Information)  (0) 2025.11.30
C++ 4대 캐스트(cast)  (0) 2025.11.30
[c++] 포인터*와 참조&  (0) 2025.11.30
vtable(가상 함수 테이블) 개념  (0) 2025.11.30