2013-11-03 7 views
0

에 의해 함수에 전달 된 후 무효가됩니다 :표준 : : auto_ptr은 내가 다음 예제 코드를 가지고 값

#include <iostream> 
#include <auto_ptr.h> 

class A 
{ 
public: 
    A(){ std::cout << "A ctor" << std::endl;} 
    ~A() {std::cout << "A dtor" << std::endl;} 
    void bar(){std::cout << "bar()" << std::endl;} 
}; 

void foo(std::auto_ptr<A> a) 
{ 
    std::cout << "foo()" << std::endl ; 
} 

int main() 
{ 
    std::auto_ptr<A> a(new A()); 
    a->bar(); 
    return 0; 
} 

출력 : 지금은 foo(a), a 것 호출하는 경우

A ctor 
bar() 
A dtor 

전화하기 전에 파괴된다. bar() :

int main() 
{ 
    std::auto_ptr<A> a(new A()); 
    foo(a); 
    a->bar(); 
    return 0; 
} 

출력 : 왜 afoo() 후 파괴되어

A ctor 
foo() 
A dtor 
bar() 

가 호출된다?

내가 참조 foo에 매개 변수를 전달하면 내가 이해하지 못하는 또 다른 한가지는, afoo()를 호출 한 후 파괴되지 않습니다 것을

:

void foo(std::auto_ptr<A> &a) 
{ 
    std::cout << "foo()" << std::endl ; 
} 

int main() 
{ 
    std::auto_ptr<A> a(new A()); 
    foo(a); 
    a->bar(); 
    return 0; 
} 

출력 :

A ctor 
foo() 
bar() 
A dtor 

은 어떻게 평생에 영향을 미치는 참조로 전달 하시겠습니까?

답변

6

auto_ptr은 복사시 소유권을 훔칩니다. 복사하면 사본에 객체에 대한 포인터가 저장되고 원본에는 아무 것도 저장되지 않습니다.

또한 비추천 개념입니다. C++ 11에 액세스 할 수 있으면 대신 unique_ptr을 사용하십시오.

+1

unique_ptr도 소유권을 이동합니다. 그의 경우에는 shared_ptr을 의미하지 않습니까? – user1810087

+2

@itwasntpete 차이점은'std :: unique_ptr'에는 복사 생성자가 없으며 이동 복사 생성자 만 있다는 것입니다. 그래서 소유권을 이전하기 위해 인스턴스에'move'를 호출해야합니다 (또는 임시 또는 rvalue를 전달하십시오). 'shared_ptr'는'auto_ptr'의 올바른 대체물이 아닙니다. – juanchopanza

2

auto_ptr에는 전송 소유권의 의미가 있습니다. 값으로 전달하면 소유권은 일시적 객체로 옮겨지며, 이는 물론 범위를 벗어날 때 파괴됩니다.

1

std :: auto_ptr은 대개 사람들이 기대하는 바가 아니므로 객체가 범위를 벗어나면 ptr이 지워 지므로 더 안전한 개념이라고 생각하면됩니다. 그래서 당신의 "새로운 A"는 여러 번의 반환/예외가 던져진 경우에도 유출되지 않을 것입니다.

그러나 단일 포인터를 공유하는 두 개의 auto_ptrs가 하나의 레서피이기 때문에 불법적 인 메모리 액세스가 발생하기 쉽습니다. 재앙.

당신이 사용할 수있는 ptr을 원한다면 release에 대해 걱정하지 말고 unique_ptr을 사용해야합니다. unique_ptr을 복사 할 수 없습니다. 따라서 참조를 전달할 수는 있지만 복사 할 수는 없습니다.

일반적으로 가장 유용한 구성은 shared_ptr이며 여러 소유자가 동일한 ptr을 공유 할 수 있으며 모든 소유자가 범위를 벗어날 때 배포됩니다.

이 모두는 C++ 11 표준 라이브러리의 일부이거나 부스트 라이브러리를 통해 사용할 수 있습니다.