Smart Pointer
박경남
차례
• Smart Pointer?
• 등장배경 ~ 원리
• 여러가지 Smart Pointer
• 사용 예
Memory Leak
CPU
Memory
Idea
Idea
Idea
Idea
Idea
Idea
Idea
Idea
auto_ptr
1. 배열 해제 불가능
2. Reference Counting을 지원하지 않음
shared_ptr
여전히 배열 해제 불가능
unique_ptr
Reference Counting을 지원하지 않음
다시 shared_ptr
default_delete??
My Deleter
shared_ptr의 소멸자에선..
lambda
Example : vector
Example : vector
Example : File Handle
Example : Wrapping
Example : CreateFileWA
Example : CreateFileWA
HANDLE hFile = CreateFile(…)
CloseHandle(hFile)
FILE* fp = fopen(…)
fclose(fp)
Person* p = new Person()
delete p
winnt.h
Example : CreateFileWA
Smart pointer

More Related Content

PPTX
포인터의 기초(1)
PPTX
튜터링자료 1.adt
PPTX
Study1
PDF
자구4번
PPTX
3.포인터
PDF
4. 함수포인터
PPTX
포인터의기초 (2) - 포인터 사용하기1
PDF
자료구조04
포인터의 기초(1)
튜터링자료 1.adt
Study1
자구4번
3.포인터
4. 함수포인터
포인터의기초 (2) - 포인터 사용하기1
자료구조04

What's hot (7)

PDF
안드로이드기초
PDF
2012 Ds D2 03 Pdf
PPTX
C++ Template/STL study
PDF
[Swift] Extensions
PPTX
Java standard(8~13)
DOCX
자료구조 Project4
DOCX
자료구조 Project6
안드로이드기초
2012 Ds D2 03 Pdf
C++ Template/STL study
[Swift] Extensions
Java standard(8~13)
자료구조 Project4
자료구조 Project6
Ad

Viewers also liked (18)

PDF
Kennismiddag verandercommunicatie bij de Academie voor Overheidscommunicatie
PPTX
Ggisi 56
PPT
Bulungi Creative
DOCX
Taller+de+conversiones+bd+db (1)
PPTX
Pdhpe slideshow
PPTX
Strategies in Knowledge Transfer
PPTX
Helpinighands oms
DOCX
Tugas Ke IV Mekanika Tanah I, Redha Arima RM
PPT
Innledning universell utforming
PPTX
Watermeloons oms
PPT
Оказание первой помощи пострадавшим
PPTX
Cheetah oms
PPTX
Not Your Grandmother's Library!
PDF
Use of Coordinated Multipoint Transmission for Relaxation of Relay Link Bott...
PPT
bulungi creative
PPTX
Presentació curs fisqui
PPTX
портфоліо
PPT
SEO продвижение - сравнение с конкурентами
Kennismiddag verandercommunicatie bij de Academie voor Overheidscommunicatie
Ggisi 56
Bulungi Creative
Taller+de+conversiones+bd+db (1)
Pdhpe slideshow
Strategies in Knowledge Transfer
Helpinighands oms
Tugas Ke IV Mekanika Tanah I, Redha Arima RM
Innledning universell utforming
Watermeloons oms
Оказание первой помощи пострадавшим
Cheetah oms
Not Your Grandmother's Library!
Use of Coordinated Multipoint Transmission for Relaxation of Relay Link Bott...
bulungi creative
Presentació curs fisqui
портфоліо
SEO продвижение - сравнение с конкурентами
Ad

More from NewHeart (6)

PDF
테스트 주도 개발과 유닛 테스트 툴
PDF
ADB Backup 관련 연구
PDF
Web framework security
PPTX
Public key
PDF
Android App Reversing
PDF
Functional programming
테스트 주도 개발과 유닛 테스트 툴
ADB Backup 관련 연구
Web framework security
Public key
Android App Reversing
Functional programming

Smart pointer

Editor's Notes

  • #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
  • #9: 참쉽죠
  • #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을 지원 안함..
  • #16: 다시 shared_ptr로 돌아갑니다..
  • #17: 직접 구현해 쓸 수도 있겠다
  • #18: deleter를 직접 정의해 넘길 수 있으므로 상황에 맞는 좀더 유연한 프로그래밍이 가능해짐 예를들어 객체 배열을 해제하기 전 뭔가 반드시 해야 할 일을 deleter안에서 해준다던가.. 1. 구조체다. 2. ()연산자가 오버로딩되어있다 3. shared_ptr 생성자의 두번째 인자는 원래 함수포인터를 받고, ()연산으로 그 함수를 호출해주는데 이녀석이 함수가 아니라 객체인데도 잘 동작하는 것은 스스로 ()연산을 허용해서 함수처럼 동작할 수 있기 때문
  • #19: _Dtor가 바로 shared_ptr 생성자의 두번째 인자로 들어온 녀석 이놈에게 ()연산자로 _Ptr을 넘기고 있다 ()연산 = 함수호출 생성자의 두번째 인자는 기본적으로 함수포인터를 받기 위한 인자 하지만 모든 자료형에 대한 함수를 만들기 위해 template을 이용해 구현하다 보니 struct나 class형태로 구현하게 된것 이런 구현방식은 표준라이브러리에서 많이 보인다 예) algorithm헤더 sort함수의 세번째 인자에 넘기는 함수포인터. 어쨌든 중요한 건 shared_ptr의 두번째 인자의 본질은 함수포인터라는 것
  • #20: cpp 문법 표준에 lambda가 포함되면서 많은 일들이 가능해졌다
  • #21: vector container에 포인터 자료형을 저장하는 경우. 일반적인 경우 반드시 루프를 돌며 해제하는 작업이 필요 vector를 쓸 때 가장 불편했던 것 중 하나
  • #22: vector나 shared_ptr이나 모두 연산자 오버로딩이 잘 구현되어 있어 직관적으로 쉽게 사용할 수 있다 vector에서 대괄호연산자 오버로딩 shared_ptr에서 화살표연산자 오버로딩
  • #23: 어플리케이션이 할당받은 뒤 반환해야만 하는 건 메모리뿐만이 아님 아까 말했던 대로 shared_ptr생성자의 두번째 인자로 함수포인터를 받는다는 사실을 이용해 fclose 함수포인터를 넘기면 알아서 호출해줄 것
  • #24: 이 한줄이면 자동으로 반환되는 파일포인터를 얻을 수 있다 fclose에서 해방!!
  • #25: handle을 넘기는 부분에서 에러 발생
  • #26: shared_ptr은 포인터가 아닌 자료형을 받아 관리해주는 녀석인데 HANDLE은 이 자체로 이미 void* 그냥 viod를 넘겨도 작동은 하지만 코드 모양이 엘레강스하지 못하다!! HANDLE을 넘기고 포인터만 뗄 수 있다면 어떨까
  • #27: 자료형에서 포인터만 떼어주는 녀석이 있다! 이름만 들어도 포인터를 떼어줄거같은 remove_pointer
  • #28: 어려운 내용도 아니고 그저 표준 라이브러리 중 하나의 사용법 정도라 이해하기는 쉬울 것 하나 느꼈으면 하는 건 학교에서 알려주는 건 정말 지극히 일부분. 쓸데없는 것도 많음. 자기가 관심 갖고 재미있어 하면서 찾아 공부해야 한다는 것. 질문?