:
첫째, new
및 delete
++ C 모두 실제로 사업자이다; 이러한 연산자를 오버로드하여 개체에 대한 사용자 지정 할당 동작을 제공하려는 경우 누출을 방지하기 위해 매우주의해야합니다.
둘째, 일부 유형의 개체는 메모리 관리 버그를 피하기 위해 을 오버로드해야합니다. 예를 들어, 스마트 포인터 객체 (Boost shared_ptr와 같은)를 계산하는 참조가있는 경우 operator=
을 구현해야하며 올바르게 수행해야합니다. 이 부러진 예제를 생각해 봅시다 :
template <class T>
class RefCountedPtr {
public:
RefCountedPtr(T *data) : mData(data) { mData->incrRefCount(); }
~RefCountedPtr() { mData->decrRefCount(); }
RefCountedPtr<T>& operator=(const RefCountedPtr<T>& other) {
mData = other.mData;
return *this;
}
...
protected:
T *mData;
};
가 mData
및 other.mData
에 참조 카운트를 관리하지 않기 때문에 여기 깨지는 operator=
구현 : 그것은 누출로 이어지는 mData
에 참조 카운트를 감소하지 않는다; 참조 카운트를 other.mData
으로 증가시키지 않습니다. 실제 참조가 모두 사라지기 전에 가리킨 객체를 삭제할 수 있기 때문에 메모리 오류가 발생할 수 있습니다.
클래스에 대해 자신의 operator=
을 명시 적으로 선언하지 않으면 컴파일러에서 여기에 표시된 구현과 동일한 동작을하는 기본 구현을 제공한다는 점에 유의하십시오. 즉,이 특정 사례에서 완전히 깨졌습니다.
기사에서 말하는 것처럼 어떤 경우에는 연산자를 오버로드해야하며 모든 상황을 올바르게 처리해야합니다.
EDIT : 죄송합니다. 참고 문헌이 책이 아닌 온라인 기사라는 것을 알지 못했습니다. 전체 기사를 읽은 후에도 의도 한 바가 명확하지 않지만 Eckel은 아마 위에서 설명한 두 번째 상황과 관련 있다고 생각합니다.
저는 C++로 작업하지 않았습니다. 그러나 연산자를 오버로드하면 새 값을 반환해야 할 수 있습니다 (간단한 값의 경우 스택에, 복잡한 유형의 경우에는 힙에 포함될 수 있음). 사람 * a; 사람 * b; 사람 * c = a + b; – shahkalpesh