#3:스마트 포인터가 뭔지 원리를 알아보며 직접 구현해 볼 것
스마트 포인터에 몇가지 종류가 있는데, 하나하나 살펴볼 것
실용적인 사용 예들을 보여줄 것
#4:Mcafee siteadvisor라는 firefox 플러그인에 발생하던 메모리 누수 버그
많은 메모리를 필요로 하는 프로세스가 생성됨
종료 시 모든 메모리를 free 해주지 못하고 남아있음
다른 process가 사용하지도 못하게 차지만 하고 있음. 엄청나게 커다란 이슈!!
Win7부터는 OS차원에서 어느정도 관리해줌.
하지만 여전히 application개발자에게도 메모리 관리에 대한 책임이 없는것은 아님
C/C++이 아닌 C#/Java/Python 등등의 interprete언어들, virtual machine언어들이 떠오른 이유 중 하나로
C/C++을 쓸 때 메모리 관리가 너무나 힘들다는 게 큰 요소 중 하나라고 봄
다른 언어들은 메모리 관리에 대한 부담이 거의 없음.
C++진영에서 이 문제를 해결하기 위해 내놓은 아이디어가 바로 스마트포인터
#5:사용법만 나열하는 것은 의미가 없음
사용법만 알고 주구장창 쓰는 건 엔지니어가 아닌 코더들
코드만 쭉 보여드릴 건데, 어려운 개념은 아님
실행 결과는?
#6:실행결과는?
생성자만 호출될 것.
우리가 원하는 건 delete를 쓰지 않아도
메모리 누수 걱정할 필요 없이
자동으로 해제가 되었으면!!!!
#7:두개를 비교해봅시다.
M의 소멸자는 신경안써도 알아서 호출되지만
P의 소멸자는 알아서 호출이 되지 않는다!
객체포인터 P자체의 해제도 중요하지만
P객체 내부에서 할당했던 메모리를 해제하기 위해
소멸자의 해제도 중요!!
P의 소멸자가 호출되도록 delete p구문을
언젠가는 호출되는 manager소멸자에 넣어버리자
#8:생성자에 person포인터를 받는다
소멸자에선 알아서 해제시켜준다!!
이 Manager class가 바로
가장 기본적인 smart pointer
#10:소멸만 제대로 시키면 뭐하나
Eat()라는 메소드를 호출하고 싶다!!!
방법을 만들어보자
#11:그냥 리턴해줘도 되지만, 좀더 엘레강스하게 직관적으로 쓰고싶다
->연산자오버로딩으로 p객체에 자연스럽게 접근하자
#12:보기 좋다!!
여기까지가 기본적인 스마트포인터의 개념이고 핵심 원리.
여기에 템플릿을 씌우면 모든 자료형에 대해 메모리 관리가 가능할 것
#13:지금까지의 개념을 그대로 구현한 표준 라이브러리 auto_ptr
2003년도 표준. 현재는 deprecated 상태. 사용하면 warning이 뜰 것
1. 배열 해제가 불가능
2. Reference counting을 지원하지 않음.
한번 할당받은 주소를 여러 포인터가 참조하는 경우는 흔한 일
근데 한 녀석이 먼저 해제해버리면 다른 녀석들이 못쓰는 문제 발생
몇놈들이 이 주소를 참조하고 있는 지 세어주는 기능을 reference counting이라고 함
#14:Shared_ptr Boost에 있다가 11년도 표준 된 라이브러리
Auto_ptr말고 shared_ptr합시다
Reference count가 0이 되면 delete실행
근데 아직도 배열 해제는 안된다
#15:unique_ptr을 쓰면 배열 해제 가능!!
템플릿 부분에 배열타입을 명시해줄 수 있음
근데 얘는 reference counting을 지원 안함..
#18:deleter를 직접 정의해 넘길 수 있으므로
상황에 맞는 좀더 유연한 프로그래밍이 가능해짐
예를들어 객체 배열을 해제하기 전 뭔가 반드시 해야 할 일을 deleter안에서 해준다던가..
1. 구조체다.
2. ()연산자가 오버로딩되어있다
3. shared_ptr 생성자의 두번째 인자는 원래 함수포인터를 받고, ()연산으로 그 함수를 호출해주는데
이녀석이 함수가 아니라 객체인데도 잘 동작하는 것은 스스로 ()연산을 허용해서 함수처럼 동작할 수 있기 때문
#19:_Dtor가 바로 shared_ptr 생성자의 두번째 인자로 들어온 녀석
이놈에게 ()연산자로 _Ptr을 넘기고 있다
()연산 = 함수호출
생성자의 두번째 인자는 기본적으로 함수포인터를 받기 위한 인자
하지만 모든 자료형에 대한 함수를 만들기 위해 template을 이용해 구현하다 보니
struct나 class형태로 구현하게 된것
이런 구현방식은 표준라이브러리에서 많이 보인다
예) algorithm헤더 sort함수의 세번째 인자에 넘기는 함수포인터.
어쨌든 중요한 건
shared_ptr의 두번째 인자의 본질은 함수포인터라는 것