ONE QUESTION AT A TIME.

천천히 생각하고, 분명하게.

TODAY’S QUESTION312 / 1500
언어·런타임난이도 하5분 답변 목표 · 보강본

C++에서 락과 파일을 RAII 객체로 관리합니다. 상태를 일부 바꾼 뒤 예외가 나면 자원 해제와 변경 전 상태로의 복구가 모두 보장되나요?

잠깐, 답변을 보기 전에
먼저 내 말로 설명해 볼까요?

답변과 점검 포인트 펼치기답변 접기
01

구두 답변

정의를 외우기보다, 원리와 조건을 연결해 설명해 보세요.

RAII는 객체 수명에 맞춰 자원을 해제하도록 돕지만, 이미 변경한 데이터까지 원래대로 복구된다는 뜻은 아닙니다. 파일 핸들을 닫는 것과 계좌 이체를 되돌리는 것은 다릅니다. 저는 자원이 새지 않는지와 중간 변경이 일관된 상태로 남는지를 따로 확인하겠습니다.

해제와 롤백은 다른 계약

RAII는 자원을 객체의 생성·소멸에 묶는 관용구입니다. 예를 들어 lock_guard는 스코프를 벗어나면 락을 해제합니다. 하지만 락 안에서 잔액을 차감한 뒤 다른 연산이 실패했다면, 락이 풀리는 것만으로 차감한 잔액이 돌아오지는 않습니다. 무엇을 자동 정리하는지와 무엇을 되돌려야 하는지를 분리해야 합니다.

예를 들어 컨테이너에 새 값을 넣는 도중 메모리 할당이 실패할 수 있습니다. 락은 자동으로 풀려도 원래 데이터를 먼저 지웠다면 값이 사라질 수 있습니다. 실패해도 유효한 상태를 유지하는 기본 보장과, 실패 시 관찰 가능한 상태가 변하지 않는 강한 보장을 구분해야 합니다. 강한 보장이 필요하면 임시 객체에서 새 상태를 완성한 뒤 실패하지 않는 교체 연산으로 반영하겠습니다. 대신 복사와 추가 메모리 비용이 생깁니다.

강한 보장의 경계

프로세스가 std::abort나 강제 종료로 끝나면 스택 풀기가 일어나지 않아 RAII 소멸자 실행을 보장할 수 없습니다. 소멸자에서 실패할 수 있는 외부 저장까지 마무리하려고 하지는 않겠습니다. 소멸 과정에서 다시 예외를 던지면 종료로 이어질 수 있고 호출자가 복구하기도 어렵습니다. 실패 결과가 중요한 작업은 명시적인 완료 함수에서 확인하고, 소멸자는 남은 자원의 안전한 정리에 집중시키겠습니다. 테스트에서는 할당이나 복사 중간에 실패를 주입해 누수뿐 아니라 원래 상태와 불변식이 유지되는지 확인하겠습니다.

선택 기준과 검증

강한 예외 보장은 작업이 실패했을 때 호출자가 관찰하는 상태가 변경 전과 같다는 뜻입니다. 실패 뒤 보상 작업을 수행하는 설계는 유용하지만 보상 자체가 실패할 수 있으므로 강한 예외 보장과 동일하지 않습니다. 프로세스가 std::abort나 강제 종료로 끝나면 스택 풀기가 일어나지 않아 RAII 소멸자도 실행된다고 보장할 수 없습니다. 정상 반환·예외·강제 종료를 구분해 파일 무결성과 자원 회수를 확인하겠습니다.

생성자에서 자원을 얻다가 뒤 단계가 실패하면 완전히 생성된 멤버의 소멸자는 실행되지만, 생성에 실패한 객체 자체의 소멸자를 기대해서는 안 됩니다. 원시 포인터나 핸들을 멤버로만 저장하고 나중에 정리하려 하면 생성 중 예외에서 누수가 생길 수 있으므로, 획득한 즉시 소유 RAII 멤버에 넣겠습니다. 이런 설계는 정상 경로보다 실패한 부분 초기화에서 차이가 드러납니다.

강한 보장의 커밋 단계로 쓰는 swap도 해당 타입과 할당자 조건에서 실제로 예외를 던지지 않아야 합니다. 여러 객체를 순서대로 교체하면 두 번째 교체의 실패가 부분 변경을 남길 수 있으므로 하나의 새 상태를 완성해 한 경계로 게시할 수 있는지 검토하겠습니다. 소멸자는 보통 noexcept여야 하고, 이미 예외로 스택을 푸는 중 다시 예외가 빠져나오면 terminate될 수 있습니다. 파일 close 실패와 주 예외를 함께 기록하되 나머지 자원 정리를 막지 않는 오류 경로가 필요합니다.

02

득점 포인트

이해가 드러나는 지점을 확인해 보세요.

  • RAII 자원 해제와 데이터 롤백을 분리한다.
  • 기본·강한·무예외 보장을 상태 불변식에 맞춰 선택한다.
  • 외부 커밋과 소멸자 실패를 별도 경계로 설계한다.
03

감점 포인트

놓치기 쉬운 조건과 오해를 짚어 보세요.

  • RAII가 이미 반영한 데이터의 롤백까지 보장한다고 말한다.
  • 소멸자에서 중요한 실패를 예외로 던져 종료 경로를 망친다.
  • 강한 보장을 무조건 복사로 구현해 비용과 외부 경계를 무시한다.
04

더 파고들 거리

하나 더 질문하며 이해의 범위를 넓혀 보세요.

득점·감점 포인트는 학습용 자기 점검 기준이며, 특정 회사의 실제 채점표가 아닙니다.

원리부터 공부하고 싶다면

답변을 보충하는 개념·예제·슈도코드를 읽어 보세요.

← 전체 질문 보기