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