2011-04-27 5 views
1

다음 작업을 수행 할 수 있습니까? 분명히 호출자는 알몸 포인터를 삭제할 수 없습니다. shared_ptr을 사용하고 shared_ptr을 반환해야합니까? 이것 때문에 너무 무거워 보입니다.클래스의 unique_ptr에 알몸 포인터를 반환하는 것이 좋습니다.

class A 
{ 
    B* GetB() { return pointer.get(); } 
private: 
    unique_ptr<B> pointer; 
}; 
+0

분명히, 배수가 공존하기를 원하는 것처럼 더 이상 고유 한 포인터가 없습니다. 나는 내 가정에 의문을 제기하는 것으로 시작할 것입니다. –

답변

4

나는 그것이로는 포인터가 delete D 의도되지 않는 문서에 분명히하고, 잘 작동해야한다고 생각합니다.

여전히 참조를 반환합니다.이 경우 발신자가 delete이 아니어야한다는 암시가 있습니다.

class A 
{ 
    B & GetB() { return *(pointer.get()); } 
private: 
    unique_ptr<B> pointer; 
}; 

편집이 포인터가 NULL 될 수 있음을 밝혀; 이 경우 참조는 피해야합니다.

당신 단지 포인터를 캡슐화 스마트 바보 do_not_delete_me_ptr 클래스의 어떤 종류를 작성하고 당신이 그것을 삭제하지해야 여분 명확하게,하지만 난이 너무 지나친 생각 할 수있다. ;) unique_ptr에 부스트 워드 프로세서

+0

문제는 null이 될 수있는 객체입니다 –

+0

그러면 포인터가 적합합니다. –

+1

@Sriram : 그렇다면 'NULL'포인터를 역 참조하는 것 (심지어 참조를 작성하는 것까지)이 UB이기 때문에 참조가 확실히 선택되지 않습니다. 이 물건에 대해'shared_ptr'을 사용하여 벌거 벗은 포인터 + doc 경고를하고 싶습니다. * way * overkill입니다. –

0

:

unique_ptr은 CopyConstructible (복사 가능 생성자)이 아니며 CopyAssignable 그러나 그것은 MoveConstructible이며, 입주 지정 가능.

unique_ptr은 사본을 회원으로 유지하기 때문에 반환 할 수 없습니다.

개체의 할당이 보장되면 포인터가 null이 아니므로 참조를 반환합니다.

+1

그는 'unique_ptr'을 반환하지 않고,'unique_ptr '이 캡슐화하고있는 포인터를 반환합니다. –

+0

죄송합니다. 내 대답을 잘못 표현했습니다. 이 문제가 해결되어야합니다. –

+0

é : 이제 괜찮습니다. :) –

관련 문제