2014-02-19 2 views
1

C 코드를 클래스로 변환하기 때문에 std :: shared_ptr과 같은 새로운 C++ 11 기능을 사용하고 있으며이 코드에는 " 구식 "포인터. 나는 하나의 의문이있다 : 클래스의 메소드에서, 내가 shared_ptr을 사용하는 곳에서, 다른 smart_ptr에 대한 전달 된 참조의 데이터로 초기화 한 다음 데이터를 수정할 수 있습니까? 예 :std :: shared_ptr이 다른 shared_ptr 데이터로 초기화되었습니다.

void myFunction(std::shared_ptr<T> &my_reference) 
{ 
    std::shared_ptr<T> my_local_ptr(my_reference.get()); 

    /* Doing stuff on local pointer, 
     which modifies the object kept by my_reference pointer */ 
} 

내가 잘못 했습니까? 또는이 중복 작업을 수행하지 않고도 my_reference의 데이터를 직접 수정하는 것이 더 좋다고 생각하십니까?

감사

마이크

+3

, 당신을 지금 별도의 참조 카운트를 갖는 * 2 개의 개별 공유 포인터가 있지만 둘 다 동일한 객체를 가리 킵니다. 이것은 일반적으로 좋은 생각이 아닙니다. 예를 들어 'std :: shared_ptr my_local_ptr = my_reference;'옳은 일은 "자동적으로"일어날 것입니다. –

답변

2

당신이하고있는 것은 (기술적으로 유효한 코드이지만, 의도 아마 무엇을) 잘못되었습니다. 이와 같이 구성하면 my_local_ptrmy_reference과 같은 개체를 가리 키지 만 고유 한 참조 횟수 (1로 초기화 됨)를가집니다. 표준 용어로는 my_reference과 "소유권을 공유하지 않습니다".

그리고 my_local_ptr이 범위를 벗어나면 행복하게 deleter를 호출합니다. - 가리키는 객체를 삭제하고 my_reference을 매달 웁니다. 그런 다음 my_reference과 마지막으로 shared_ptr 소유권을 공유 할 때 파괴되면 해당 삭제자를 호출하여 이중 삭제가 발생합니다 (그 전에는 매달 기가 충돌을 일으키지 않는 한).

당신은 전달 된 shared_ptr의 로컬 복사본을, 필요하면 (어떤 어쨌든, 하시나요?) 확실히 전체 shared_ptr (를 포함하여 소유권을) 복사 : 당신이하고있는 일을함으로써

void myFunction(std::shared_ptr<T> &my_reference) 
{ 
    std::shared_ptr<T> my_local_ptr(my_reference); 

    /* Doing stuff on local pointer, 
     which modifies the object kept by my_reference pointer */ 
} 
+0

예 방금이 책을 읽었습니다. http://en.wikipedia.org/wiki/Smart_pointer 순수한 할당으로 소유권을 공유하는 것에 대해 확신하지 못했습니다. – madduci

관련 문제