: 복사가 이루어지는 클래스에 포인터가 있다면,
얕은복사에 대비해서 반드시 유저는 복사 생성자를 따로 만들어서
깊은 복사가 가능한 코드를 작성해야 한다.
이 표현이 정확할 듯.
: 객체 복사 시, 멤버 포인터의 참조값뿐 아니라, 포인터까지 복사하는 현상
-> 해제시에 2개의 소멸자에서 동일한 포인터를 2번 해제하기 때문에
메모리 릭이 발생한다.
>
쉽게
: 서로 다른 객체의 멤버가 동일한 포인터를 복사하는 것을 말함.
// 값이 아니라 동일한 메모리를 참조하게 됨.
디폴트 복사 생성자의 특징
: 디폴트 복사 생성자는 모든 멤버 데이터간의 복사 대입을 이루어지게 함.
문제점
: 클래스에 포인터가 존재하고, 소멸자에서 해제하는 코드가 존재시
동일한 포인터를 2번 해제하게 됨.
해결하는 방법
: 위의 내용을 토대로 클래스를 만들고, 얕은 복사 문제를 발생시켜라
-> 동일한 메모리의 주소를 공유하고 있고, 메모리 2번 해제하므로
문제 발생함.
쉽게
서로 다른 객체의 멤버가 동일한 포인터가 아닌, 새로운 포인터를 할당 후,
값을 복사 하게 하는 복사를 말함.
어렵게
: 클래스 안에 포인터 멤버가 있을 때, "메모리 주소를 복사하지 말고, 메모리
자체의 복사본을 만드는 기술"
(유저가 복사 생성자를 직접 정의 해야함. )
: 메모리 낭비.
: Student 에서 발생한 문제를 해결하라.
설명
: 여러 객체가 공유하는 포인터 변수를 하나 만들어서,
복사 생성시 카운팅을 통해 얕은 복사를 해결하는 것을 말함.
주의할 점.
이때 일반생성자에서는 할당을 하고, 복사가 일어날 경우, 포인터 변수를
대입함으로써, 여러개의 객체가 단 하나의 메모리를 공유하도록 하자.
소멸자에서 포인터 변수를 확인하면서 , 모든 객체 제거시
카운팅 0 일때 포인터 변수를 해제하는 방법.
카운팅 갯수의 의미는 참조하고 있는 객체의 갯수를 나타냄.
여러 객체가 하나의 자원을 공유함.
: 참조 카운팅을 만들어라