일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- c# scv
- git명령어
- sprintboot
- 그라나다
- 바르셀로나
- HTTP #웹기술
- 스페인 준비물
- 아펠가모
- 관심지향프로그래밍
- Srping AOP
- Kotlin
- 마드리드
- 스페인
- 스프링 AOP
- b-tree index
- elk
- 코틀린
- 코프링
- 본식후기
- kopring
- 코틀린 함수
- db index
- 아펠가모선릉
- http상태코드
- kotiln
- HTTP
- 아펠가모 선릉
- @Component
- 400에러
- 세비야
- Today
- Total
끄적이는 메모장
[C++11] make_shared 본문
#make_shared
make_shared와 new의 사용 비교
auto work1(std::make_shared<Test>());
std::shared_ptr<Test> work2(new Test);
new를 사용했을 때
1. Test라는 Type을 중복하여 두 번이나 사용해야 한다.
2. exception에 safety 하지 않을 수 있다.
2의 예시
void func2(std::shared_ptr<Test> p1, int a);
-> func2(std::shared_ptr<Test>(new TEST), func1());
이 함수가 실제 실행 되기 위해서는
a. new 를 TEST 객체 생성
b. 생성된 객체로 shared_ptr 생성
c. func1 실행
세 단계가 유효해야함
만약 a-c-b 순으로 실행되었는데! c 함수 실행 중 exception이 발생하였다!
그럼 b를 실행 할 수 없는데... 이미 a를 실행하였기 때문에 객체는 생성되어 있는 상태
하지만 객체가 shared_ptr에 의하여 관리 될 수 없다 (b가 실행 될 수 없기 때문_
-> 결과적으로 메모리 누수 !!
따라서 make_shared()를 사용하면 이와 같은 문제들을 해결할 수 있다.
1. 중복된 코드를 사용하지 않아도 되기 때문에 속도 측면에서 이득을 볼 수 있다. (물론, 코딩 시 발생 할 수 있는 실수를 줄일 수도 있다.)
2. 객체 생성과 shared_ptr 생성이 한번에 처리되기 때문에 exception에 의한 문제가 발생하지 않는다
make_shared를 사용하지 말아야 할때
1. 별도의 소멸자를 지정하려고 할때 -> make_shared를 소멸자를 지정할 방법이 없음
2. 리스트의 초기화 값을 포함한 클래스
3. 특정 클래스에서 new와 delete를 새롭게 정의 한 경우 -> shared_ptr에서 필요한 control block의 크기를 고려하지 않고 메모리를 할당 했을 가능성이 있다!
'C, C++, C# > C++ 공부' 카테고리의 다른 글
[C++11] lambda expression (0) | 2018.05.31 |
---|---|
[C++11] range for loop (0) | 2018.05.30 |
[C++11] shared_ptr / weak_ptr (0) | 2018.05.30 |
[C++11] unique_ptr / smart pointer (0) | 2018.05.30 |
[C++11] nullptr (0) | 2018.05.30 |