공유 포인터는 참조 카운트를 사용하여 구현된다는 것을 알아야합니다. 즉, 포인터 그래프에 사이클이 있으면 오브젝트가 해제되지 않는다는 것을 의미합니다. 즉, b 및 b에 대한 점이 a를 가리키고 a 또는 b를 가리 키지 않으면 a 및 b 둘 다 참조 횟수가 '1'이므로 해고되지 않습니다.
부스트는이 문제를 해결할 수있는 약한 포인터를 제공하므로 참조 횟수를 증가시키지 않고 공유 객체에 대한 포인터를 저장할 수 있습니다. 약한 포인터는 공유 포인터가 해제 된 후 포인터를 역 참조하려고 시도 할 때 프로그램의 충돌을 일으키지 않고 예외를 발생시키는 안전 레이어를 제공합니다.
공유 포인터도 성능 측면에서 상당히 비쌉니다 (적어도 원시 포인터와 비교할 때).하지만 포인터를 사용하고 어디서나 프로파일 러가 병목 현상을 식별하면 제거하는 것이 좋습니다.
그렇지만 동적 할당 객체를 관리하는 데 매우 유용합니다.
편집 : 또 다른 잡았다 (즉,이 부스트 페이지에 언급 한 것) "일시적으로"shared_pointers을 방지하는 것입니다 : 컴파일러는
tmp1 = new B;
tmp2 = A();
tmp3 = boost::shared_ptr<B>(tmp1)
func(tmp2,tmp3)
으로이를 최적화 할 수있다
func(A(), boost::shared_ptr<B>(new B));
때문에 보일 수있는 언뜻보기에 괜찮 았지만 A()가 예외를 발생시킨 다음 B가 할당되었지만 shared_ptr이 아직 그것을 확보하지 못해 포인터가 해제되지 않습니다.
정말 좋아하는 소리는 boost :: ptr_vector입니다. 벡터는 포인터의 소유권을 가져 와서 덮어 쓰거나 벡터가 소멸되면 포인터를 삭제합니다. –
Java처럼 코드를 작성하면 "C++의 효율성"을 얻을 수 있다고 생각합니까? 마법은 없습니다. 프로그램이 C++로 작성 되었기 때문에 프로그램이 빠르지 않습니다. 그것은 효율적이기 위해 작성 되었기 때문에 빠릅니다. C++이 자바 인 것처럼 보이는 것은 유지 보수성과 성능면에서 최악의 경우를 제공합니다. – jalf