auto p1 = std::shared_ptr<int>(new int, [](void * p) {
delete (int*)p;
});
auto p2 = std::unique_ptr<int>(new int, [](int * p) {
delete p;
});
shared_ptr의 경우 템플릿 파라미터에 deleter의 타입을 주지 않아도 생성자의 deleter 타입을 추론해서 포인터가 적절히 생성된다. 내부적으로 shared_ptr객체 자체가 아니라 다른 곳에 deleter를 저장하고 그에 대한 포인터를 가진다.
하지만 unique_ptr의 경우 포인터 객체 내부에 deleter를 저장하며 템플릿 인자로 deleter의 타입을 주지 않을 경우 기본적으로 std::default_delete<int>가 사용되도록 되어 있다. 그래서 lambda를 std::default_delete<int>로 변환이 안되므로 에러가 나게 된다. 이를 해결하려면 shared_ptr와 다르게 unique_ptr의 deleter 타입을 명시적으로 지정해주어야 한다.
auto p2 = std::unique_ptr<int, void(*)(int*)>(new int, [](int * p) {
delete p;
});
댓글 없음:
댓글 쓰기