스마트 포인터를 더 사용하고자하는 프로젝트가 있습니다. 전반적으로, 나는이 목표에 성공적이었다. 그러나, 나는 "우수 사례"가 무엇인지 잘 모르는 한 가지를 발견했습니다.스마트 포인터가 보유해야하는 '포인터'를 반환합니다.
기본적으로 함수에서 "포인터"를 반환하고 싶지만 은 사용자가 스마트 포인터에 보유하고있는을 필요로합니다. 뿐만 아니라 특정 스마트 포인터 (공유 대 스코프)를 위임하고 싶지 않습니다.
대부분 문제는 scoped_ptr
을 shared_ptr
으로 업그레이드하는 적절한 방법이 없다는 것입니다 (이것이 내가 생각하기에 이상적인 해결책 일 것입니다). 나는 그들이 왜 이런 일을하지 않았는지 이해합니다. 왜냐하면 소유권 이전을 허용하기 때문에 std::auto_ptr
같은 몇 가지 문제가 발생할 수 있습니다.
그러나 소유권 이전은 의 경우이 사례의 경우 좋은 것으로 보입니다. 그래서 내 생각은 다음과 같이이다 :
는// contrived example of factory pattern
std::auto_ptr<A> func() { return std::auto_ptr<A>(new A); }
이 scoped_ptr
및 shared_ptr
모두가 std::auto_ptr
에서 소유권을 가져 생성자를 갖고 있기 때문에 "확인"작동합니다.
제 질문은 이것이 좋은 습관입니까? 더 나은 해결책이 있습니까?
// similar to above example
template <template <typename> class P>
P<A> func() { return P<A>(new A); }
실제로 나는 그것이 그것을 얻기 위해 몇 가지 작업을해야 할 것이라고 생각하는 것을 제외하고 잘 작동 수 : 유일한 대안은이 같은 반환 값으로 템플릿 템플릿을 사용하여 올 수있었습니다 scoped_ptr
도 사용하십시오.
생각하십니까?
단일 스레드 빌드의 shared_ptr은 원자 참조 카운팅을 사용하지 않습니다. –
맞습니다.하지만 기본적으로 멀티 스레드 버전에서는 빌드가 향상됩니다. – Artyom
auto_ptr보다 scoped_ptr을 사용하면 포인터를 복사하지 않아도된다는 이점이 있습니다. scoped_ptr을 사용하면 안됩니다. 귀하의 의도가 auto_ptr 및 소유권 이전과 함께하는 것처럼 귀하의 의도 전달에 관한 것입니다. –