Resource Acquisition Is Initialization
: C++의 중요한 프로그래밍 원칙으로,
리소스의 할당과 해제를 객체의 생성자와 소멸자를 통해 관리하는 방식
명시적인 리소스 해제 코드없이 자동 소멸되어 관리 됨.
- 리소스의 할당 -> 객체의 생성자
- 리소스의 해제 -> 객체의 소멸자
RAII 주요 개념
리소스(예: 메모리, 파일 핸들, 소켓 등)
- 리소스 획득은 객체의 생성에 묶인다.
- 리소스를 객체의 생성자에서 획득
- 리소스를 사용할 수 있는 상태를 객체의 생명주기에 따라 결정
- 리소스 해제는 객체의 소멸에 묶인다.
- 객체의 소멸자가 호출될 때, 생성자에서 할당된 리소스를 자동으로 해제
- 명시적으로 리소스를 해제할 필요가 줄어든다.
장점
- 예외 안전성
: 예외가 발생하면 소멸자가 호출되어 리소스가 확실히 해제 - 메모리 누수 방지
: 소멸자에서 리소스를 해제하므로 메모리 누수를 방지 - 코드 간결화
: 리소스 관리를 명시적으로 하지 않아도 됨 - 가독성 향상
: 리소스 관리 코드가 간결하고 명확해짐
활용 사례
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
반응형
'Programming Language > C++' 카테고리의 다른 글
[C++] map / unordered_map 자료 구조 (0) | 2024.11.28 |
---|---|
[C++] set / unordered_set 자료 구조 (1) | 2024.11.26 |
지시문 #define에 대해서... (1) | 2024.02.02 |
포인터 변수 초기화 방법 (0) | 2023.08.06 |