끄적이는 메모장

[C++11] make_shared 본문

C, C++, C#/C++ 공부

[C++11] make_shared

밥보92 2018. 5. 30. 15:17
반응형

#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의 크기를 고려하지 않고 메모리를 할당 했을 가능성이 있다!

 

참고 블로그 http://itability.tistory.com/37

반응형

'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