C++: auto_ptr + forward declaration? 및 그 대답, 특히 accepted one을 읽고 auto_ptr과 forward 선언 클래스를 결합 할 때 함정을 알고 있습니다. 하지만이 QA (및 기타 모든 auto_ptr-tagged Questions)에서 다루지 않는 것처럼 보이는 동일한 패턴으로 런타임 문제가 발생합니다.형식이 있음에도 불구하고 std :: auto_ptr이 누락되었습니다. 소멸자에서 정규화 된 것입니다.
내 Outer
과 같은 클래스 [1]을 파괴 할 때 간혹 액세스 위반이 발생하며 때로는 누락 된 소멸자 호출 만 관찰합니다. 내가 생성자와 소멸자 cpp가 파일에 거기 Inner
유형의 정의를 구현하고있어
// Outer.h - an example header
#include <uncopyable.h>
#include <memory>
class Inner;
class Outer: private Uncopyable
{
public:
Outer()
~Outer();
private:
std::auto_ptr<Inner> inner;
};
이 존재합니다.
- 이
Inner.h
Outer.h
내에서 또는 - 명시 적으로
inner.reset()
나는 C++ 만 컴파일 레거시 코드 작업을 호출 포함 - 빌더 : 나는 경우
// Outer.cpp - an example implementation #include "Outer.h" //< I use this include order to ensure compileability #include "Inner.h" //< for units including Outer.h without preconditions Outer::Outer(): inner(new Inner) {} Outer::~Outer() {}
설명 된 문제
가 사라 6, 그래서 나는 고집해야한다std::auto_ptr
컴파일러가 지원하는 유일한 smart_ptr 구현이기 때문에 (현재)이 유형에 대한 대안이 없습니다 (C++ 11에서는 사용되지 않습니다).
내 질문 : 여기서 잘못된 것이 무엇입니까, 아니면 아마도 BCB6의 잘 알려진 버그입니까 [2]?
추가 비 나는 uncomplete 유형에 auto_ptr은 사용하는 허브 셔터의 기사 Using auto_ptr Effectively, 그것으로 섹션 포장 포인터 데이터 멤버 거래를 읽은 안전 할 것이라고 예상했다. 따라서 위에서 설명한 문제는 매우 혼란스러운 경험입니다.
- [1] 본 실시 예는 auto_ptr은 사용량의 정규 구조를 논의 삭감된다.
- [2] 볼랜드 C++ 5.6.4 및 C++와 함께 제공되는 STL - 빌더 6 (upd4를)
std :: tr1 :: shared_ptr에 대한 액세스 권한이 있다면 시도해 보셨습니까? – tillaert
'외부'는 복사 할 수있는 유형을위한 것입니까? ** 예 ** 인 경우 '내부'는 무엇을해야합니까? ** 없다면 **, 왜 '내부'가 소멸자에서 처리되는 원시 포인터가 아닌가? –
@tillaert까지 멀지 않습니다. (auto_ptr의 사용은 BCB6 개발자 가이드에 의해 권장됩니다. 이는 VCL과 잘 작동 함을 의미합니다.) – Wolf