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