프로그래밍C++ 개발자

C++에서 RAII와 예외가 어떻게 작동하는지 설명해 주시겠어요? 리소스 관리의 올바른 구현이 중요한 이유는 무엇인가요?

Hintsage AI 어시스턴트로 면접 통과

답변.

**RAII (Resource Acquisition Is Initialization)**는 C++의 관용구로, 객체의 생애를 통해 리소스(파일, 메모리, 소켓 등)의 생애를 관리할 수 있게 해줍니다. 리소스는 객체의 생성자에서 할당되고 소멸자에서 해제됩니다.

코드 예:

#include <fstream> void save_data(const std::string& filename, const std::string& data) { std::ofstream file(filename); // RAII: 파일이 자동으로 닫힙니다 if (!file) throw std::runtime_error("파일을 열 수 없습니다"); file << data; } // 파일은 여기서 닫힙니다

예외가 발생하더라도 소멸자는 여전히 호출되므로 리소스가 누수되지 않습니다. RAII를 사용하지 않으면 메모리 및 파일 디스크립터 누수에 직면할 수 있습니다.

트릭 질문.

C++에서 try/catch만 사용하여 메모리 누수를 방지할 수 있나요?

아니요, 불가능합니다. 단순히 try/catch를 사용하는 것만으로는 리소스가 해제될 것을 보장하지 않습니다. 보장을 제공하는 것은 오직 RAII입니다.

예:

int* arr = new int[10]; try { // arr 작업 throw std::runtime_error("업스"); } catch (...) { // delete[]가 없으면 arr이 해제되지 않음 } // arr이 누수됨!

주제의 미세한 차이를 모른 것으로 인한 실제 오류 사례.


이야기

대규모 그래픽 프로젝트에서 파일 디스크립터 고갈로 인한 크래시가 주기적으로 발생했습니다. 파일은 RAII(즉, std::fstream)로 래핑 없이 함수에서 열리고 예외가 발생할 때 리소스가 해제되지 않았습니다.


이야기

웹 서버의 요청 처리기에서 스마트 포인터로 래핑되지 않은 원시 메모리를 사용했습니다. 예외가 발생할 때 메모리가 해제되지 않아 성능 저하 및 크래시가 일어났습니다.


이야기

이미지 처리 프로젝트에서는 객체로 래핑되지 않은 임시 파일이 생성되었습니다. 예외가 발생할 때 파일이 삭제되지 않아 몇 달 간의 지속적인 운영 후 /tmp가 가득 차는 결과를 초래했습니다.