class Widget {
private:
int* data; // 동적 메모리 할당된 데이터
public:
Widget(int value) { data = new int(value); }
Widget& operator=(const Widget& other) {
delete data; // 기존 데이터 삭제
data = new int(*other.data); // 새로운 데이터 복사
return *this;
}
};
Widget w(10);
w = w; // 자기 자신에게 대입 (Self-assignment)
w.operator=(w)가 실행됨delete data 실행 → w 의 데이터가 삭제new int(*[other.data](<http://other.data>)) 실행 → 하지만 other.data 는 이미 삭제위 문제의 해결 방법
Widget& operator=(const Widget& other) {
if (this == &other) return *this; // 자기 자신이면 아무것도 하지 않음
delete data;
data = new int(*other.data);
return *this;
}
Widget& operator=(const Widget& other) {
int* newData = new int(*other.data); // 새 데이터를 먼저 생성
delete data; // 기존 데이터 삭제
data = newData; // 새 데이터로 교체
return *this;
}
class Widget {
private:
int* data;
public:
Widget(int value) { data = new int(value); }
~Widget() { delete data; }
void swap(Widget& other) { // 두 개의 객체를 교환하는 함수
std::swap(data, other.data);
}
Widget& operator=(Widget other) { // 복사 생성자를 활용한 대입 연산자
swap(other); // 복사본과 데이터를 교환
return *this;
}
};
Widget other 에서 복사 생성자를 호출해 새로운 복사본을 만든다swap(other); 를 통해 this 와 복사본의 데이터를 교환other 객체가 소멸되면서 기존 데이터를 자동으로 삭제