C++메모리와 자원 관리

exception safety와 noexcept

예외가 발생해도 객체 상태와 자원이 어떻게 보존되어야 하는지, 그리고 `noexcept`가 어떤 의도로 쓰이는지 정리합니다.

마지막 수정 2026년 3월 22일

기본 패턴

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