기본 패턴
cpp
class Buffer {
public:
Buffer(Buffer&& other) noexcept = default;
Buffer& operator=(Buffer&& other) noexcept = default;
};설명
- 예외 안전성은 "예외가 나도 자원이 새지 않고, 객체가 최소한 일관된 상태를 유지하는가"를 묻는 개념입니다. 단순히
try-catch문법을 아는 것보다 더 중요한 설계 감각입니다. - 보통 예외 안전성은 basic guarantee, strong guarantee 같은 수준으로 설명합니다. 최소한 객체 불변식이 깨지지 않는지, 가능하면 실패 전 상태로 되돌릴 수 있는지가 핵심입니다.
- RAII는 예외 안전성을 가능하게 만드는 가장 중요한 기반입니다. raw 자원을 직접 쥐고 있지 않고, 스코프 기반 객체가 정리하도록 맡기면 예외 전파 중에도 누수를 줄일 수 있습니다.
noexcept는 "이 함수는 예외를 던지지 않는다"는 계약을 표현합니다. 특히 move constructor와 move assignment에noexcept가 붙으면 표준 컨테이너가 더 공격적으로 move를 활용할 수 있습니다.- 중요한 점은
noexcept가 성능 힌트이면서도 계약이라는 것입니다. 실제로 예외가 날 수 있는 함수에 무심코 붙이면 프로그램 종료로 이어질 수 있으므로, 의도를 정확히 알고 써야 합니다.
빠른 정리
| 개념 | 의미 |
|---|---|
| basic guarantee | 객체 불변식과 자원 정리는 유지 |
| strong guarantee | 실패하면 원래 상태 유지 |
| RAII | 예외 중에도 자원 정리 보장 기반 |
noexcept | 예외를 던지지 않는다는 계약 |
| 잘 맞는 곳 | move 연산, 정리 함수, 강한 계약 API |
주의할 점
noexcept는 멋있어 보이는 최적화 키워드가 아니라 강한 약속입니다. 실제로 실패 가능성이 있는 함수에 붙이면
문제를 숨기는 대신 더 급격한 종료를 부를 수 있습니다.
참고 링크
2 sources