boost::scoped_ptr
documentation에는 Handle/Body Idiom이라고하는 기술의 예가 들어 있습니다. 그것은 다음 단어에 대하여 설명된다 :boost :: scoped_ptr 문서 불일치?
scoped_ptr_example_test.cpp 샘플 프로그램 실행을 숨길 불완전 형 에 scoped_ptr를 <>를 사용하는 헤더 파일 scoped_ptr_example.hpp를 포함한다.
은 그러나, 동시에, documentation for checked_delete
에서이 적혀있다 :
특히 까다로운 경우가 때 스마트 포인터의 소멸자, 같은 부스트 :: scoped_ptr를 :: ~ scoped_ptr를, 불완전한 유형으로 인스턴스화됩니다. 이로 인해 종종 침묵하고 추적하기 어려운 오류가 발생할 수 있습니다. 은 완전한 유형이 필요하고 그렇지 않으면 컴파일 오류가 발생하므로 제공된 함수 및 클래스 템플릿을 사용하여 이러한 문제를 방지 할 수 있습니다.
scoped_ptr
실제로 구현시 checked_delete
을 사용합니다. 내게는 두 구절이 서로 모순 된 것처럼 보입니다. scoped_ptr
의 문서는 erronous, 실제로 그렇습니다
checked_delete.hpp:32: error: invalid application of 'sizeof' to
incomplete type 'MyClass'
또는 그냥 뭔가를 그리워 : 또한, 나는 다음과 같은 메시지가 제안 트릭을 사용하려고 내 코드를 컴파일하지?
실제로 소멸자와 생성자는 모두 사용자 정의되어야합니다. 컴파일러가 생성 된 생성자가 기본 생성자를 사용하면 컴파일러는 유형이 불완전한'main()'에서'scoped_ptr'을 인스턴스화하려고 시도합니다. – FireAphis
실제로 'shared_ptr'과 같은 문제는 유형 삭제를 사용하여 생성자에 인스턴스화 된 삭제 객체를 만들기 때문에 발생하지 않습니다. 참고로 클래스의 불완전 유형에'shared_ptr'을 사용하고이 클래스의 생성자 만 정의 할 수 있습니다. –
@FireAphis : 생성자를 사용자 정의 할 필요는 없습니다. 'scope_ptr' 템플릿의 인스턴스화는'scope_ptr'의 소멸자가 인스턴스화된다는 의미는 아니며 사용 된 메소드 만 인스턴스화됩니다. 그리고 불완전한 타입의 생성자를 사용하는 것이 정의되지 않았다고 생각하지 않습니다 불완전한 타입의 경우에는 괜찮은 포인터를 전달/저장) - 즉, 생성자가 타입을 동적으로 할당하지 않았다고 가정합니다. 여기서 불완전한 타입이 다시 문제가되는 경우입니다. –