여러 가지 이유가있을 수 있습니다. 몇 가지를 나열하려면 다음을 수행하십시오.
- 스마트 포인터는 최근에 표준의 일부가되었습니다. 그때까지 그들은 다른 도서관의 일부였습니다
- 주요 용도는 메모리 누수를 방지하는 것입니다. 많은 라이브러리에는 자체 메모리 관리 기능이 없습니다. 일반적으로 유틸리티와 API를 제공합니다.
- 그것들은 실제로 포인터가 아니라 객체이기 때문에 래퍼로 구현됩니다. 원시 포인터에 비해 추가 시간 / 공간 비용이 있습니다. 도서관 사용자는 이러한 오버 헤드를 원하지 않을 수 있습니다.
편집 : 스마트 포인터 사용은 완전히 개발자의 선택입니다. 다양한 요인에 따라 다릅니다.
성능이 중요한 시스템에서는 오버 헤드를 생성하는 스마트 포인터를 사용하지 않을 수 있습니다.
이전 버전과의 호환성이 필요한 프로젝트, C ++ 11 특정 기능이있는 스마트 포인터를 사용하고 싶지 않을 수 있습니다.
Edit2 아래 통과로 인해 24 시간 동안 여러 개의 반대표가 있습니다. 아래는 추가 제안 일 뿐이며 답변이 아닌데도 왜 답변이 비추천인지 이해하지 못합니다.
그러나 C ++는 항상 옵션을 열 수 있도록합니다. :) 예
template<typename T>
struct Pointer {
#ifdef <Cpp11>
typedef std::unique_ptr<T> type;
#else
typedef T* type;
#endif
};
그리고 코드에서 다음과 같이 사용하십시오.
Pointer<int>::type p;
스마트 포인터와 원시 포인터가 다르다고 말하는 사람들에게는 동의합니다. 위의 코드는 단지 a와 교환 할 수있는 코드를 작성할 수 있는 아이디어 일뿐입니다. #define
이것은 강제 가 아닙니다 .
예를 들어 T*
는 명시 적으로 삭제해야하지만 스마트 포인터는 삭제하지 않습니다. 우리는 Destroy()
그것을 처리 할 템플릿 을 가질 수 있습니다 .
template<typename T>
void Destroy (T* p)
{
delete p;
}
template<typename T>
void Destroy (std::unique_ptr<T> p)
{
}
다음과 같이 사용하십시오.
Destroy(p);
같은 방식으로 원시 포인터의 경우 직접 복사 할 수 있고 스마트 포인터의 경우 특수 작업을 사용할 수 있습니다.
Pointer<X>::type p = new X;
Pointer<X>::type p2(Assign(p));
다음 Assign()
과 같습니다.
template<typename T>
T* Assign (T *p)
{
return p;
}
template<typename T>
... Assign (SmartPointer<T> &p)
{
}