Resource Acquisition Is Initialization

: C++의 중요한 프로그래밍 원칙으로,
리소스의 할당과 해제를 객체의 생성자와 소멸자를 통해 관리하는 방식
명시적인 리소스 해제 코드없이 자동 소멸되어 관리 됨.

  • 리소스의 할당 -> 객체의 생성자
  • 리소스의 해제 -> 객체의 소멸자

RAII 주요 개념

리소스(예: 메모리, 파일 핸들, 소켓 등)
  1. 리소스 획득은 객체의 생성에 묶인다.
    • 리소스를 객체의 생성자에서 획득
    • 리소스를 사용할 수 있는 상태를 객체의 생명주기에 따라 결정
  2. 리소스 해제는 객체의 소멸에 묶인다.
    • 객체의 소멸자가 호출될 때, 생성자에서 할당된 리소스를 자동으로 해제
    • 명시적으로 리소스를 해제할 필요가 줄어든다.

장점

  • 예외 안전성
    : 예외가 발생하면 소멸자가 호출되어 리소스가 확실히 해제
  • 메모리 누수 방지
    : 소멸자에서 리소스를 해제하므로 메모리 누수를 방지
  • 코드 간결화
    : 리소스 관리를 명시적으로 하지 않아도 됨
  • 가독성 향상
    : 리소스 관리 코드가 간결하고 명확해짐

활용 사례

1. 스마트 포인터

스마트 포인터(std::unique_ptr, std::shared_ptr)는 RAII의 대표적인 구현입니다.
#include <memory>
#include <iostream>

void example() {
    std::unique_ptr<int> ptr(new int(42)); // 리소스 할당
    std::cout << *ptr << std::endl;        // 리소스 사용
} // ptr이 스코프를 벗어나면서 자동으로 delete 호출

2. 파일 핸들 관리

#include <fstream>
#include <iostream>

void example() {
    std::ifstream file("example.txt"); // 파일 열기 (리소스 할당)
    if (!file.is_open()) {
        std::cerr << "파일을 열 수 없습니다.\n";
        return;
    }
    // 파일 작업
} // file이 스코프를 벗어나면서 자동으로 close 호출

3. 뮤텍스 잠금

C++ 표준 라이브러리의 "std::lock_guard"는 RAII로 뮤텍스 잠금을 관리합니다.
#include <mutex>
#include <iostream>

std::mutex mtx;

void example() {
    std::lock_guard<std::mutex> lock(mtx); // 뮤텍스 잠금
    std::cout << "Critical section\n";     // 보호된 코드
} // lock이 스코프를 벗어나면서 자동으로 unlock 호출

 

출처)

 

개체 수명 및 리소스 관리(RAII)

리소스 누수 방지를 위해 최신 C++에서 RAII 원칙을 따릅니다.

learn.microsoft.com

 

반응형

+ Recent posts