내가 그패스
class Base
{
//some implementation
};
class Deriv: public Base
{
//implementation
}
class Case1
{
boost::scoped_ptr<A> a_ //polymorphic data member owned by C
public:
Case1(A* a):a_(a)
{
}
};
class Case2
{
boost::scoped_ptr<A> a_ //polymorphic data member owned by C
public:
Case2(std::auto_ptr<A> a):a_(a.release())
{
}
};
같은 다형성 클래스 구조를 가지고 있고 제 3 클래스를 가지고 말할 수 있습니다 케이스 가구 1 위에서 설명한 다형성 객체의 하나 소유/2. 이제 Base/Deriv 객체에 대한 포인터를이 객체의 소유권을 취하는 case1/2 클래스의 생성자에 전달해야합니다. 예를 들어이 객체를 스마트 포인터로 전달해야합니까? auto_ptr은 그것이 내가이 개체의 치료를 쳐있어 명확하게, 또는 원시 포인터 (사례 1)과 같은 매우 간단한 구문을 허용 할 수
당신은 스마트 포인터를 전달해야Case1 c(new Deriv);
//compared to
Case2 c(std::auto_ptr<Base>(new Deriv));
사이에 정확히 0 코드가 있음을 의미합니까? 나는 또한 그것이 일시적 일 수없는 이유도 모르겠다. – Puppy
@DeadMG : 사이에 0 코드 어디? 'Case1' 생성자가 원시 포인터 인수를 스마트 포인터에 할당하기 전에 예외를 throw 할 수있는 작업을 수행하면 객체가 유출됩니다. 주제에 대한 Herb Sutter의 GOTW 기사 링크를 추가했습니다. 생성자가 단 하나의 인수 만 취하는 경우에는 문제가되지 않지만 Boost 지침을 비롯한 대부분의 올바른 코딩 스타일에서는 이러한 이유로 모든 스마트 포인터의 이름을 지정하는 것이 좋습니다. –
@James : 그가 Case1 c (new Deriv)를 호출하면 첫 번째 Deriv가 생성되고 Case1이 소유권을 갖습니다. 중간에 던져 질 수있는 코드가 없습니다. 편집 : 그 허점은 C++ 98에 대해 이야기하고 있습니다.내가 아는 한 주로이 결함을 수정하기 위해 존재했던 C++ 03에 여전히 존재한다는 것을 증명하는 또 다른 기사를 찾아야 할 것입니다. – Puppy