프로그래밍C++ 개발자

C++11에서의 세 가지 및 다섯 가지 규칙(세 가지 규칙/다섯 가지 규칙)에 대해 설명하고, 클래스 설계에서의 중요성을 설명하십시오.

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

답변.

세 가지 규칙: 클래스가 자원을 관리한다면(예: 메모리), 다음 메서드 중 하나를 명시적으로 구현한다면 나머지를 구현해야 합니다:

  • 소멸자
  • 복사 생성자
  • 복사 대입 연산자

C++11: 다섯 가지 규칙 – 이동 연산자가 추가되었습니다:

  • 이동 생성자
  • 이동 대입 연산자

이 규칙을 위반하면 자원 소유권 오류가 발생할 수 있으며, 이는 이중 삭제 또는 메모리 누수와 같은 문제로 이어질 수 있습니다.

코드 예:

class Buffer { char* data; public: Buffer(size_t sz) : data(new char[sz]) {} ~Buffer() { delete[] data; } Buffer(const Buffer& other) : data(new char[strlen(other.data)+1]) { strcpy(data, other.data); } Buffer& operator=(const Buffer& other) { if (&other != this) { delete[] data; data = new char[strlen(other.data)+1]; strcpy(data, other.data); } return *this; } // C++11+에서의 이동 의미: Buffer(Buffer&& other) noexcept : data(other.data) { other.data = nullptr; } Buffer& operator=(Buffer&& other) noexcept { if (&other != this) { delete[] data; data = other.data; other.data = nullptr; } return *this; } };

속임수 질문.

클래스가 포인터를 관리할 때 소멸자만 구현하면 충분한가요?

아니요. 복사 및 이동 연산자가 없으면 복사 시 이중 메모리 해제가 발생할 수 있습니다. 예:

Buffer a(10); Buffer b = a; // b와 a는 동일한 포인터를 삭제합니다!

주제에 대한 지식 부족으로 인한 실제 오류 사례.


이야기

통신 데이터 집계 플랫폼에서 모든 클래스는 소멸자만 구현했습니다. 구조를 리팩토링한 후, 대량의 double free 현상이 발생했습니다: 객체 복사가 무작위 행동을 유발했습니다.


이야기

모바일 게임 프로젝트에서 버퍼의 컨테이너 클래스에 대한 이동 생성자를 구현하는 것을 잊었습니다. 이동할 때 객체가 복사되어 불필요한 데이터 복사가 발생하고 성능 저하를 초래했습니다.


이야기

데이터 구조 직렬화 라이브러리에서 함수에서 객체를 반환할 때 임시 객체가 반환되었고, 복사 생성자는 포인터의 얕은 복사를 수행했습니다. 여러 메모리 누수가 발생했으며, 이는 몇 개월 후에야 나타났습니다.