Bjarne이 사는 세상은 더 나은 학기를 원하기 때문에 매우 학문적입니다. 객체가 매우 고의적 인 관계형 계층 구조를 가지도록 소유권을 관계가 엄격하고 고르지 않게 코드를 설계하고 구조화 할 수있는 경우 코드가 한 방향 (고수준에서 저수준으로)으로 흐르고 개체는 계층 구조를 사용할 필요가 없습니다 shared_ptr
. 누군가 규칙을 어겨 야하는 드문 경우에 사용하는 것입니다. 그러나 그렇지 않으면 vector
가치 의미론을 사용하는 모든 데이터 구조 또는 기타 데이터 구조에 모든 것을 집어 넣을 수 있습니다 unique_ptr
.
그것이 살기 좋은 세상이지만, 항상 그렇게하는 것은 아닙니다. 그러한 방식으로 코드를 구성 할 수 없다면 , 만들려는 시스템의 설계가 불가능하거나 매우 불쾌한 것이므로 객체의 공유 소유권이 점점 더 많이 필요하다는 것을 알게 될 것입니다 .
그러한 시스템에서, 알몸의 포인터를 잡는 것은 정확히 위험하지는 않지만 질문을 제기합니다. 가장 좋은 점은 객체의 수명에 대해 합리적인 구문 보장을 shared_ptr
제공한다는 것 입니다. 깨질 수 있습니까? 물론이야. 그러나 사람들은 또한 일을 할 수 있습니다 . 기본 관리 및 먹이는 소유권을 공유해야하는 할당 된 개체에 적절한 삶의 질을 제공해야합니다.const_cast
shared_ptr
그런 다음 weak_ptr
s가 있으며 shared_ptr
. 가 없으면 사용할 수 없습니다 . 시스템이 견고하게 구성되어 있으면 응용 프로그램의 구조가 객체가 당신보다 오래 지속되도록 보장한다는 사실을 알고 있으므로 일부 객체에 대한 알몸 포인터를 저장할 수 있습니다. 내부 또는 외부 값 (예 : X라는 개체 찾기)에 대한 포인터를 반환하는 함수를 호출 할 수 있습니다. 올바르게 구조화 된 코드에서 객체의 수명이 자신의 수명을 초과 한 경우에만 해당 기능을 사용할 수 있습니다. 따라서 객체에 알몸 포인터를 저장하는 것이 좋습니다.
실제 시스템에서는 이러한 강성이 항상 가능한 것은 아니므로 수명 을 합리적으로 보장 할 수있는 방법이 필요 합니다. 때로는 완전한 소유권이 필요하지 않습니다. 때로는 포인터가 나쁜지 또는 좋은지 알 수 있어야합니다. 그건 어디 weak_ptr
에서 오는 나는 경우가 있었다. 수 사용 된 한 unique_ptr
또는 boost::scoped_ptr
,하지만 난을 사용했다 shared_ptr
나는 때문에 특별히 누군가에게 "휘발성"포인터를 제공 할 필요가 있었다. 수명이 불분명 한 포인터는 포인터가 파괴되었을 때 쿼리 할 수 있습니다.
세상의 상태가 불확실 할 때 살아남는 안전한 방법.
를 통해 대신 포인터를 얻기 위해 함수 호출로 수행 할 수 weak_ptr
있습니까? 예,하지만 더 쉽게 깨질 수 있습니다. 알몸 포인터를 반환하는 함수는 사용자가 포인터를 장기 저장하는 것과 같은 것을하지 않는다는 것을 구문 적으로 제안 할 방법이 없습니다. a shared_ptr
를 반납하면 다른 사람이 간단히 보관하여 물건의 수명을 연장 할 수 있습니다. weak_ptr
그러나을 돌려주는 것은 shared_ptr
당신이 얻는 것을 저장하는 lock
것이 ... 모호한 생각이라는 것을 강력히 제안합니다 . 그것은 당신이 그것을하는 것을 멈추지 않을 것이지만 C ++의 어떤 것도 당신이 코드를 깨는 것을 막을 수 없습니다. weak_ptr
자연스럽게하는 일에 대한 저항을 최소화합니다.
그것은 과용shared_ptr
될 수 없다고 말하는 것이 아닙니다 . 확실히 할 수 있습니다. 특히 사전 에 RAII 포인터를 전달하거나 목록에 넣어야했기 때문에 방금 사용한 경우가 많았 습니다. 및 이동 의미하지 않고 , 유일한 진짜 해결책이었다.unique_ptr
boost::shared_ptr
unique_ptr
boost::shared_ptr
그리고 불필요한 곳에서 사용할 수 있습니다. 위에서 언급했듯이, 적절한 코드 구조는의 일부 사용 필요성을 제거 할 수 있습니다 shared_ptr
. 그러나 시스템을 이와 같이 구성 할 수없고 여전히 필요한 작업을 수행하는 경우 shared_ptr
크게 사용됩니다.