2014-09-16 3 views
15

똑똑한 행동을 유지하고 싶습니다 std::shared_ptr. 그렇다면 참조 카운팅을 혼동하지 않으면 서 공유 된 void 포인터를 다른 유형으로 캐스팅 할 수있는 방법이 있습니까? 원시 포인터를 가져 와서 새로운 포인터를 생성 할 수 없습니다.shared_ptr <void>을 shared_ptr <T>으로 전송할 수 있습니까?

+1

가능한 복제본 http://stackoverflow.com/questions/6795629/how-does-one-downcast-a-stdshared-ptr –

+0

@BillyONeal : 아니요, 'void'는 모든 유형의 기본 클래스가 아닙니다. C++은 순수한 객체 지향 코드가 아닙니다. – MSalters

+0

@MSalters : 그 이유는 실제 투표를 닫기보다는 의견을 썼다. (나는 일방적으로하고 싶지 않았다.) –

답변

20

rob mayoff's answer의 포인터 캐스트를 사용할 수 있습니다. 그러나 조심하십시오.

struct MyClass {}; 

void* rawPtr = new MyClass; 
shared_ptr<void> exampleVoid(rawPtr); // Undefined behavior; 
             // calls delete (void*)ptr; 

shared_ptr<void> exampleVoidCons(new MyClass); 
    // OK, calls shared_ptr<void>::shared_ptr<MyClass>(MyClass*) which 
    // makes a deleter calling delete (MyClass*)ptr; 

shared_ptr<MyClass> example(new MyClass); // OK, calls delete (MyClass*)ptr; 

shared_ptr<void> castToVoid = static_pointer_cast<void>(example); 
    // OK, shared_ptr's deleter is erased so this still calls delete (MyClass*)ptr; 

는 일반적으로이 정의되지 않은 동작이되지 호출되는 유형의 소멸자가 발생합니다 : 실수로 여기에 정의되지 않은 동작을 유발하기 쉽습니다. 예를 들어 see the output on ideonevoid*에 삽입 된 버전은 절대로 인쇄되지 않습니다.


보기 C++ 11 5.3.5 [expr.delete]/3 :

제 대안

(개체를 삭제), 오브젝트의 정적 유형이 삭제되는 경우 다른 동적 유형에서 정적 유형은 삭제할 객체의 동적 유형의 기본 클래스이고 정적 유형은 가상 소멸자를 가져야하거나 동작이 정의되지 않습니다.

실제 목적은 동적 유형 void을하지 않아도되므로

voidvoid*는 정의되지 않은 동작을 트리거 보내고베이스 다이나믹 형 클래스 delete 결코.

+0

이 답변의 이전 버전은 내가 가지고있는'shared_ptr exampleVoid (new MyClass)'부분이 잘못되었다. 결정된. 내 발을 입에 대고 upvotes를 제거하는 것이 좋습니다 : P –

+1

+ 더 완전한 답변을 제공함에있어서 +1 또한 실수를 범했음을 인정하고 그것을 인정하고 수정하는 것이 권장되어야합니다. 우리 대부분은 배울 것이고 그 부분입니다. 프로세스의 –

+1

잘못된 예에 관한 의견을 쓰는 것처럼 수정 답변을 삭제했기 때문에 십자가입니다. –

관련 문제