2014-10-14 6 views
1

boost::shared_ptr 원시 포인터 문제를 해결합니까?boost :: shared_ptr 참조 계산은 tr1 :: shared_ptr의 원시 포인터를 해결합니다

Base* p = new Base(); 

shared_ptr <Base> sp(p); 
shared_ptr <Base> sq(p); 

shared_ptr에는 모두 심판 수가 1이므로 원시 포인터가 문제입니다.

boost::shared_ptr에도이 문제가 있습니까?

boost::shared_ptr에 문제가 없다고 들었는데 어떻게 해결 되었습니까?

+0

스마트 포인터는 더 이상 참조가 없으면 포함 된 pointee의 적절한 삭제에 대한 참조 계산 및 관리를 도입합니다. –

답변

2

아니요, boost::shared_ptr은이 문제를 해결하지 못합니다.

문제는 코드에 있으므로 직접 해결해야합니다.

shared_ptr <Base> sp(new Base()); 

지금 어떤 원시 포인터가 없기 때문에 아무 문제 :

가장 좋은 방법은 당신이 new로 객체를 생성하지 않는 경우 스마트 포인터 즉시를 초기화하면 항상을 보장하는 것입니다.

더 나은는 :

shared_ptr<Base> sp = make_shared<Base>(); 
0

당신은 잘못 들었다. 이것은 부스트 ​​나 스탠드 shared_ptr에서는 제대로 작동하지 않습니다.

제공되는 것은 shared_from_this 구성입니다. shared_ptr 참조를 찾으려면 몇 가지 마법을 수행하는 기본 클래스에서 상속받습니다 (포인터를 처음으로 채택 할 때 설정). 그럼 당신은 원시 포인터에서 공유 새를 얻을 수 있습니다 :

p->shared_from_this(); 

당신은 일이 이놈도 이미 공유 포인터에 의해 채택되었거나했다하지만 그것은 정말 끔찍한 일 터치를 할 것이라는 점을 호출하는 경우 모든 당황스러운 장소. 생성자 대신 호출해야하는 create 함수를 통해 시행하는 것이 좋습니다. 그러면 누구도 shared_ptr에없는 것을 생성하고 그 함수를 호출하지 않습니다.

이 구성을 사용하지 않으려 고 노력합니다. 자신의 타입이 공유 된 소유 구조에 있어야한다는 것을 확신 할 수 있다면 침입하는 포인터를 사용하게하십시오. 원시 포인터에 문제가있는 침입 포인터는 꽤 어리석은 일입니다 ... 나는 그 중 하나를 모릅니다. 귀하의 코드가 그들과 함께 작동합니다.

관련 문제