문제

예외 안전을 유지하고 메모리 누출을 피하기 위해 C ++에서 복사 생성자 및 할당 연산자가 수행 해야하는 작업 목록을 작성하십시오.

도움이 되었습니까?

해결책

먼저 실제로 사본을 지원해야합니다. 대부분의 경우에는 그렇지 않으므로 두 가지를 비활성화하는 것이 길입니다.

때로는 다형성 계층 구조에서 클래스에 복제를 제공해야합니다.이 경우에는 할당 연산자를 비활성화하고 (보호 된?) 사본 생성자를 작성하고 가상 클론 () 기능을 제공합니다.

그렇지 않으면, 당신이 가치 클래스를 쓰고있는 경우, 당신은 코플리엔의 직교 정식 형태의 땅으로 돌아갑니다. 사소하게 복사 할 수없는 멤버가있는 경우 카피 구성 자, 소멸자, 과제 운영자 및 기본 생성자를 제공해야합니다. 이 규칙은 개선 될 수 있습니다. 예를 들어 참조하십시오. 큰 두 사람의 법

또한 살펴 보는 것이 좋습니다 할당 연산자에 관한 C ++ FAQ, 그리고 카피 앤 스왑 관용구 그리고 at gotw.

다른 팁

컴파일러 생성 버전은 대부분의 상황에서 작동합니다.

객체에 원시 포인터가 포함되어있을 때 문제에 대해 조금 더 어렵다고 생각해야합니다 (원시 포인터가 없다는 주장). 그래서 당신은 원시 포인터가 있습니다. 두 번째 질문은 포인터를 소유하고 있습니까 (당신에 의해 삭제되고 있습니까)? 그렇다면 4의 규칙을 적용해야합니다.

1 개 이상의 원시 포인터를 소유하는 것은 올바르게 수행하기가 점점 어려워지고 있습니다 (복잡성의 증가는 선형이 아닙니다. 따라서 원시 포인터가 둘 이상이라면 자체 클래스 (일부 형태의 스마트 포인터)에서 각각을 감싸는 것에 대해 생각하십시오.

규칙 4 : 객체가 원시 포인터의 소유자 인 경우 메모리 관리를 올바르게 처리하려면 다음 4 명의 멤버를 정의해야합니다.

  • 건설자
  • 생성자 복사
  • 과제 연산자
  • 폐물 소각로

이를 정의하는 방법은 상황에 따라 다릅니다. 그러나 조심해야 할 사항 :

  • 기본 구성 : 포인터를 NULL로 설정하십시오
  • 생성자 복사 : 사본을 사용하고 Ideum을 바꾸어 "강력한 예외 보증"에 제공합니다.
  • 과제 연산자 : 자체에 대한 과제를 확인하십시오
  • 소멸자 : 소멸자에서 전파되는 예외를 보호합니다.

이것을 읽으십시오.

http://www.icu-project.org/docs/papers/cpp_report/the_anatomy_of_the_assignment_operator.html

과제 연산자에 대한 아주 좋은 분석입니다

나는 여기서 예외에 대해 안전하게 전혀 모른다. 그러나 나는 이런 식으로 간다. 템플릿 배열 래퍼라고 상상해 봅시다. 도움이되기를 바랍니다 :)

Array(const Array& rhs)
    {
        mData = NULL;
        mSize = rhs.size();
        *this = rhs;
    }

    Array& operator=(const Array& rhs)
    {
        if(this == &rhs)
        {
            return *this;
        }

        int len = rhs.size();

        delete[] mData;

        mData = new T[len];

        for(int i = 0; i < len; ++i)
        {
            mData[i] = rhs[i];
        }

        mSize = len;

        return *this;
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top