똑똑한 행동을 유지하고 싶습니다 std::shared_ptr
. 그렇다면 참조 카운팅을 혼동하지 않으면 서 공유 된 void 포인터를 다른 유형으로 캐스팅 할 수있는 방법이 있습니까? 원시 포인터를 가져 와서 새로운 포인터를 생성 할 수 없습니다.shared_ptr <void>을 shared_ptr <T>으로 전송할 수 있습니까?
답변
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 ideone과 void*
에 삽입 된 버전은 절대로 인쇄되지 않습니다.
보기 C++ 11 5.3.5 [expr.delete]/3 :
제 대안실제 목적은 동적 유형(개체를 삭제), 오브젝트의 정적 유형이 삭제되는 경우 다른 동적 유형에서 정적 유형은 삭제할 객체의 동적 유형의 기본 클래스이고 정적 유형은 가상 소멸자를 가져야하거나 동작이 정의되지 않습니다.
void
을하지 않아도되므로
및 void
는 void*
는 정의되지 않은 동작을 트리거 보내고베이스 다이나믹 형 클래스 delete
결코.
이 답변의 이전 버전은 내가 가지고있는'shared_ptr exampleVoid (new MyClass)'부분이 잘못되었다. 결정된. 내 발을 입에 대고 upvotes를 제거하는 것이 좋습니다 : P –
+ 더 완전한 답변을 제공함에있어서 +1 또한 실수를 범했음을 인정하고 그것을 인정하고 수정하는 것이 권장되어야합니다. 우리 대부분은 배울 것이고 그 부분입니다. 프로세스의 –
잘못된 예에 관한 의견을 쓰는 것처럼 수정 답변을 삭제했기 때문에 십자가입니다. –
원하는 캐스팅 종류에 따라 std::static_pointer_cast
또는 std::dynamic_pointer_cast
을 사용할 수 있습니다.
- 1. 지도 <K, shared_ptr >을 (를) 매핑하려면 <K, shared_ptr <V>>을 전송 하시겠습니까?
- 2. shared_ptr <T>을 shared_ptr <const T>으로 반환하면 "임시 주소 반환 주소"가 반환되는 이유는 무엇입니까?
- 3. 다운 캐스팅 shared_ptr <Base> to shared_ptr <Derived>?
- 4. std :: shared_ptr 초기화 <T> std :: shared_ptr <void>
- 5. shared_ptr 사용 저장된 shared_ptr의 <T>
- 6. __restrict__을 shared_ptr <T>에 적용 할 수 있습니까?
- 7. std :: set 유지하기 <boost :: shared_ptr>
- 8. 캐스팅 std :: shared_ptr <T> void *
- 9. std boost :: shared_ptr 집합 <string>
- 10. 문제 : boost :: shared_ptr <> into NewObject()
- 11. boost :: shared_ptr <> 변수가 스레드로부터 안전합니까?
- 12. 함수에 std :: shared_ptr <Resource>을 전달하는 방법은 무엇입니까?
- 13. unique_ptr <> v shared_ptr <> 파괴 정책에 관해서
- 14. boost :: shared_ptr 및 std :: shared_ptr 공존
- 15. C++ 0x std :: shared_ptr 대 boost :: shared_ptr
- 16. shared_ptr 사용
- 17. shared_ptr 반환
- 18. 포인터에서 shared_ptr
- 19. shared_ptr <Foo<Derived>>을 (를) shared_ptr <Foo<Base>> (으)로 캐스팅하는 방법은 무엇입니까?
- 20. boost :: shared_ptr 받기 (
- 21. boost shared_ptr 소유자 수 얻기
- 22. 신비한 컴파일 오류 : 'const boost :: shared_ptr <T>'에서 'const boost :: shared_ptr <T>'으로 변환 할 수 없습니다.
- 23. 진화하는 C++ std :: namespace를 처리하는 방법? 예 : std :: tr1 :: shared_ptr 대 std :: shared_ptr 대 boost :: shared_ptr 대 boost :: tr1 :: shared_ptr
- 24. 멀티 스레드 코드에서 shared_ptr 사용
- 25. 다른 유형의 shared_ptr 사용
- 26. refcounting에 shared_ptr 사용
- 27. shared_ptr 및 weak_ptr 전환
- 28. QSignalSpy 및 std :: shared_ptr
- 29. 전달 선언 및 shared_ptr
- 30. boost를 통한 다형성 shared_ptr?
가능한 복제본 http://stackoverflow.com/questions/6795629/how-does-one-downcast-a-stdshared-ptr –
@BillyONeal : 아니요, 'void'는 모든 유형의 기본 클래스가 아닙니다. C++은 순수한 객체 지향 코드가 아닙니다. – MSalters
@MSalters : 그 이유는 실제 투표를 닫기보다는 의견을 썼다. (나는 일방적으로하고 싶지 않았다.) –