make_shared를 권장하는 이유

보물창고·2022년 6월 9일
0

관련 코드

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;
#include <fstream>
#include <sstream>
#include <map>
#include <list>

#include <memory>

class Car
{
private : 
	int a, b;

public : 
	Car(int _a, int _b) {}
	Car() { cout << "constr" << endl; }
	~Car() { cout << "destr" << endl; }

};

void *operator new(size_t sz)
{
	cout << "new size : " << sz << endl;
	return malloc(sz);
}

int main()
{
	cout << "일반적인 RAII 할 경우, 메모리 구조." << endl;
	shared_ptr<Car> sptr1(new Car);
	
	cout << endl;
	cout << "make_shared 할 경우, 메모리 구조." << endl;
	shared_ptr<Car> sptr = make_shared<Car>();
}

출력

  • 자세한 내용은 이펙티브 c++ 항목 21

    shared_ptr은 객체를 참조하는 포인터 하나와
    제어블록(useCnt, weakCnt , 메모리 해지 코드등 ) 포인터로
    이루어져 있다.
    shared_ptr sptr1(new Car); 의 경우는 제어블록과 객체를 참조하는 포인터 2개가 비연속적으로 할당된다.
    이로 인해 만약에 정말! 포인터객체가 할당 중에 예외처리되면 제어블록은 생성되지 않는 상황이 발생하기도 한다.고 한다. ㅎㅎㅎ
    하지만 make_shared를 사용하면 2개의 메모리를 연속적으로 할당하기 때문에
    예외에도 안전하고, 메모리 2개가 연속적이다 라는 장점이 있다.
    비연속적인거보다 접근하기 훨씬 용이하다.

profile
🔥🔥🔥

0개의 댓글