2014-12-04 14 views
7

일반적으로 말하면 std::unique_ptrGlib::RefPtr과 같은 스마트 포인터는 해당 객체를 보유하고있는 유일한 포인터이기 때문에 다른 객체를 가리 키도록 다시 할당 할 때 해당 객체를 삭제합니다 (분명히 암시되는 std::unique_ptr)?스마트 포인터 재 할당

unique_ptr::reset 들어

답변

9

[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) 같음.

...는 움직임 할당 연산자 (템플릿) rshared_ptr<>&&이다

효과 : shared_ptr(std::move(r)).swap(*this) 같음.

*this이 개체를 소유 한 마지막 소유자 인 경우 임시 항목은 - 내부에서 삭제됩니다.


Glib::RefPtr 들어 shared_ptr 시나리오는 유사하다 : 복사 할당 연산자 (및 할당 연산자 템플릿)과 동일한 의미로 정의된다.현재 RefPtr이 다른 것에 할당되면, 현재 보유한 객체 참조 카운터는 감소되고 그 결과 카운터 값이 0이면 파괴됩니다.

+0

RefPtr something = getSomething(); something = getSomethingElse(); 잘 작동합니다. RefPtr :: swap()을 사용할 필요가 없습니다. 물론 여기서 재 할당은 단지 그것을 삭제하는 것보다 첫 번째 것에 대한 참조를 줄입니다. 참조 계산 _shared_ 스마트 포인터입니다. – murrayc

+0

@murrayc 처음으로 문서를 읽었을 때 설명서를 잘못 읽었을 것입니다. 감사! – Columbo

3

unique_ptr를 들어 대답은 '예 :

개체가 파괴되고 중 하나가의 일이 다음과 같은 경우에 메모리가 할당 해제

: 를 파괴하고있는 객체를 관리 unique_ptr

  • 개체를 관리하는 unique_ptr에는 operator = 또는 reset()을 통해 다른 포인터가 할당됩니다.

개체 Deleter가 (PTR)를 호출하여 잠재적 사용자 제공 Deleter가을 이용하여 파괴된다. Deleter는 객체 의 소멸자를 호출하고 메모리를 배포합니다.