C ++는 메모리 소유권에 관한 것 입니다. 즉 소유권 의미론 이라고도 합니다.
동적으로 할당 된 메모리 청크의 소유자는 해당 메모리를 해제 할 책임이 있습니다. 따라서 질문은 실제로 누가 메모리를 소유하는지가됩니다.
C ++에서 소유권은 원시 포인터가 내부에 래핑되어 있으므로 좋은 (IMO) C ++ 프로그램에서 원시 포인터가 전달되는 것을 보는 것은 매우 드뭅니다 ( 드물게 , 절대로 아님). (원시 포인터에는 유추 된 소유권이 없으므로 누가 메모리를 소유하고 있는지 알려주지 않으므로 문서를주의 깊게 읽지 않으면 누가 소유권을 가지고 있는지 알 수 없습니다.)
반대로, 각 원시 포인터가 자체 스마트 포인터 래퍼 내에 저장되는 클래스에 저장된 원시 포인터를 보는 경우는 거의 없습니다. ( 주의 : 객체를 소유하지 않은 경우 언제 범위를 벗어나 파괴 될지 알 수 없기 때문에 저장해서는 안됩니다.)
그래서 질문 :
- 사람들은 어떤 유형의 소유권 의미를 발견 했습니까?
- 이러한 의미를 구현하는 데 사용되는 표준 클래스는 무엇입니까?
- 어떤 상황에서 유용하다고 생각합니까?
답변 당 1 가지 유형의 의미 소유권을 유지하여 개별적으로 투표 할 수 있도록합니다.
요약:
개념적으로 스마트 포인터는 간단하고 순진한 구현이 쉽습니다. 나는 많은 시도 된 구현을 보았지만, 일상적인 사용과 예제에는 분명하지 않은 방식으로 항상 깨졌습니다. 따라서 나는 항상 라이브러리에서 잘 테스트 된 스마트 포인터를 사용하는 것이 좋습니다. std::auto_ptr
또는 Boost 스마트 포인터 중 하나가 내 모든 요구 사항을 충족하는 것 같습니다.
std::auto_ptr<T>
:
한 사람이 개체를 소유합니다. 소유권 이전이 허용됩니다.
사용법 : 소유권의 명시 적 이전을 표시하는 인터페이스를 정의 할 수 있습니다.
boost::scoped_ptr<T>
한 사람이 개체를 소유합니다. 소유권 이전은 허용되지 않습니다.
사용법 : 명시적인 소유권을 표시하는 데 사용됩니다. 개체는 소멸자에 의해 또는 명시 적으로 재설정 될 때 파괴됩니다.
boost::shared_ptr<T>
( std::tr1::shared_ptr<T>
)
다중 소유권. 이것은 간단한 참조 카운트 포인터입니다. 참조 횟수가 0에 도달하면 개체가 삭제됩니다.
사용법 : 객체가 컴파일 타임에 결정할 수없는 수명을 가진 여러 빚을 가질 수있는 경우.
boost::weak_ptr<T>
:
shared_ptr<T>
포인터주기가 발생할 수있는 상황에서 와 함께 사용됩니다 .
사용법 : 주기만 공유 참조 카운트를 유지하고있을 때 개체를 유지하는주기를 중지하는 데 사용됩니다.
In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good (IMO)
이것은 다시 표현할 수 있습니까? 나는 그것을 전혀 이해하지 못한다.
In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good C++ program it is very rare to see RAW pointers passed around
. RAW 포인터에는 소유권 의미가 없습니다. 소유자를 모르는 경우 개체 삭제를 담당하는 사람을 알 수 없습니다. 소유권을 정의하는 포인터 (std :: shared_ptr, std :: unique_ptr 등)를 래핑하는 데 사용되는 몇 가지 표준 클래스가 있습니다. 포인터 삭제 책임자를 정의합니다.