일반적으로 말하면 std::unique_ptr
과 Glib::RefPtr
과 같은 스마트 포인터는 해당 객체를 보유하고있는 유일한 포인터이기 때문에 다른 객체를 가리 키도록 다시 할당 할 때 해당 객체를 삭제합니다 (분명히 암시되는 std::unique_ptr
)?스마트 포인터 재 할당
unique_ptr::reset
들어
일반적으로 말하면 std::unique_ptr
과 Glib::RefPtr
과 같은 스마트 포인터는 해당 객체를 보유하고있는 유일한 포인터이기 때문에 다른 객체를 가리 키도록 다시 할당 할 때 해당 객체를 삭제합니다 (분명히 암시되는 std::unique_ptr
)?스마트 포인터 재 할당
unique_ptr::reset
들어
[unique.ptr.single.modifiers/4 :
효과 : 다음 저장된 포인터
p
및 을 할당 할 경우 상기 저장된 포인터old_p
의 이전 값, 가nullptr
과 같지 않은 경우get_deleter()(old_p)
으로 전화하십시오. [unique.ptr.single.asgn]/2
또는 이동 할당 연산자 operator=(unique_ptr&& u)
: 것처럼 get_deleter() = std::forward<D>(u.get_deleter())
하였다 reset(u.release())
를 호출 u
에서 *this
에
전송 소유권. (다른 할당 연산자 템플릿 상당)
shared_ptr
들어
shared_ptr
은 참조 된 객체가 소유하고있는 마지막 객체가 아닐 때 참조 된 객체를 파괴하지 않으므로 주어진 것으로 가정합시다. [util.smartptr.shared.mod]/3
shared_ptr::reset(Y*)
지정
효과 :
shared_ptr(p).swap(*this)
같음.
그러나 함수 호출이 끝날 때 일시적으로 임시 유지 객체가 삭제됩니다 (적용 가능한 경우). 동일한 동작이다 operator=(shared_ptr<> const&)
갖는다
[util.smartptr.shared.assign]/1, 4 :
효과 :
shared_ptr(r).swap(*this)
같음.
...는 움직임 할당 연산자 (템플릿) r
는 shared_ptr<>&&
이다
효과 :
shared_ptr(std::move(r)).swap(*this)
같음.
*this
이 개체를 소유 한 마지막 소유자 인 경우 임시 항목은 - 내부에서 삭제됩니다.
는 Glib::RefPtr
들어 shared_ptr
시나리오는 유사하다 : 복사 할당 연산자 (및 할당 연산자 템플릿)과 동일한 의미로 정의된다.현재 RefPtr
이 다른 것에 할당되면, 현재 보유한 객체 참조 카운터는 감소되고 그 결과 카운터 값이 0이면 파괴됩니다.
는 unique_ptr를 들어 대답은 '예 :
개체가 파괴되고 중 하나가의 일이 다음과 같은 경우에 메모리가 할당 해제: 를 파괴하고있는 객체를 관리 unique_ptr
- 을
- 개체를 관리하는 unique_ptr에는 operator = 또는 reset()을 통해 다른 포인터가 할당됩니다.
개체 Deleter가 (PTR)를 호출하여 잠재적 사용자 제공 Deleter가을 이용하여 파괴된다. Deleter는 객체 의 소멸자를 호출하고 메모리를 배포합니다.
RefPtr something = getSomething(); something = getSomethingElse(); 잘 작동합니다. RefPtr :: swap()을 사용할 필요가 없습니다. 물론 여기서 재 할당은 단지 그것을 삭제하는 것보다 첫 번째 것에 대한 참조를 줄입니다. 참조 계산 _shared_ 스마트 포인터입니다. –
murrayc
@murrayc 처음으로 문서를 읽었을 때 설명서를 잘못 읽었을 것입니다. 감사! – Columbo