헤더파일
스마트 포인터 본문
c++11에 들어오면서 꼭 해야하는게 있습니다.
-const 일관성을 유지할것
-raw pointer를 사용하지마라
-STL을 적극사용하라
-range-based for loop와 auto를 적극 사용하라
-가능한 한 모든곳에서 lamda를 사용하라
unique_ptr 자원을 독점한다.
shared_ptr 자원을 공유한다.
int main()
{
Model* p = new Model;
//Save();
}
이런 식으로 해도 문제는 없다. 운영체제가 알아서 회수는 해줍니다.
좀 더 자원을 효율적으로 사용하고 싶다면 밑에서
delete p 해주면 됩니다.
하지만 메모리를 쓰고 지우기까지는 많은 시간과 공간의 차이가 있습니다. 만드는 함수에서 바로 지우는 경우는 거의 없습니다. 때문에 해제하지 않는 객체가 존재해 메모리릭이 많이 일어날 수 있습니다.
유니크 포인터
int main()
{
unique_ptr<Model> p (new Model);
//Save();
}
스마트 포인터를 함수가 끝날 때 알아서 회수를 해줍니다..
유니크 포인터를 클래스로 직접 대충 작성해보면 이렇습니다.
template<typename T>
class up
{
T* data;
public:
up(T* p)
{
data = p;
}
up(const up& other) = delete;
~up()
{
delete data;
}
};
unique 포인터는 raw포인터와 크기가 같다.
독점한다는 의미는 다른 포인터가 가리킬려고 하지 못한다. -> 복사생성자를 delete 했다는 의미입니다.
만약에 포인터를 독점하지 않는다고 선언하고 다른 포인터로 이사가려면 어떻게 해야할까?
unique_ptr<Model> q(p.release());
release 함수로 가진 자원을 놓아준 다음에 q에게 넘겨주면 됩니다.
vector<unique_ptr<Player>> v;
v.push_back(Player());
유니크포인터는 복사가 되지 않기 때문에 vector에 담을 수 없습니다.
쉐어드포인터
프로그램은 메모리와 시간을 항상 반비례하고 어느쪽이 희생될수 밖에 없습니다.
shared_ptr은 포인터의 크기가 큰 대신 자원을 공유할 수 있습니다.
자원은 비싸기 때문에 상황에 따라 쉐어드 포인터는 유용합니다.
int main()
{
shared_ptr<Model>p(new Model{ 333 });
shared_ptr<Model>q = p;
shared_ptr<Model>r = q;
cout << r.use_count() << endl;
p.reset();
cout << r.use_count() << endl;
//Save();
}
포인터는 몇개든 붙을 수 있고 use_count()로 몇개가 붙었는지 확인할 수 있습니다.
reset함수로 해당 포인터만 끊을 수 있습니다.