2014-06-19 3 views
2

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.hOuter.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를)
+2

std :: tr1 :: shared_ptr에 대한 액세스 권한이 있다면 시도해 보셨습니까? – tillaert

+0

'외부'는 복사 할 수있는 유형을위한 것입니까? ** 예 ** 인 경우 '내부'는 무엇을해야합니까? ** 없다면 **, 왜 '내부'가 소멸자에서 처리되는 원시 포인터가 아닌가? –

+0

@tillaert까지 멀지 않습니다. (auto_ptr의 사용은 BCB6 개발자 가이드에 의해 권장됩니다. 이는 VCL과 잘 작동 함을 의미합니다.) – Wolf

답변

2
unique_ptr 지원과 새로운 컴파일러에서 컴파일 코드를 해결하기 위해 쉽게 될 것

auto_ptr을 고치는 것보다 (왜 표준위원회가 그것을 완전히 죽였다고 생각합니까?

+0

+1 예, 그렇게 보입니다. 또한이 논평을 통해이 결론을 이끌어 냈습니다. 부트 스트랩 부스트는 무겁지 만 가치가 있습니다. 동시에 마이그레이션 및 수정 작업을 수행하는 데는 많은 작업이 필요합니다. – Wolf

관련 문제