위와같이 사용하는것은 auto_ptr을 잘 못 이해하고 사용하는것과 같습니다.
(조심히 사용해야 하는것과는 별개라 생각이 드네요...)
auto_ptr에서 복사생성자를 호출하거나, 다른 auto_ptr에 대입을 하게되는 경우에 ownership을 이양하게 되어있습니다.
즉
auto_ptr<C> ptr(new C); // ownership is given to ptr
auto_ptr<C> ptr2 = ptr; // ownership is transfered to ptr2
auto_ptr<C> ptr3;
ptr3 = ptr2; // ownership is transfered to ptr3
ptr->func(); // oops !!
ptr2->func(); // oops !!
ptr3->func(); // OK
와 같습니다.
즉 함수에 호출시 파라메터로 넘길때 복사해서 넘기게 되는경우에 자신의 ownership을 잃어버리게 되는 것입니다.
만약에 위와같이 함수호출 후에 계속 사용하고 싶다고 할 경우에는,
void f(auto_ptr<int>& ap);
void g()
{
auto_ptr<int> ap(new int);
f(ap);
*ap = 0; // OK now !!!
}
와 같이, reference로서 념겨야 할 것입니다.
WOW Wow!!!
Computer Science is no more about computers than astronomy is about telescopes.
-- E. W. Dijkstra
동적할당하지 않고 가상함수를 이용할 방법이 있나요? :-)
동적할당하지 않고 가상함수를 이용할 방법이 있나요? :-)
- 죠커's blog / HanIRC:#CN
[quote="CN"]동적할당하지 않고 가상함수를 이용할 방법이 있나요?
Virtual function의 사용과 dynamic memory allocation과는 별개로 알고 있습니다:
C FAQ: http://www.eskimo.com/~scs/C-faq/top.html
Korean Ver: http://cinsk.github.io/cfaqs/
auto_ptr은 알고 계신 기능만으로도 쓸모가 있습니다. 그것 말고도
auto_ptr은 알고 계신 기능만으로도 쓸모가 있습니다. 그것 말고도 중요한 점이
또 있는데 예외에 안전하다는 것입니다.
f()에서 예외가 발생하면 S의 소멸자가 호출되는 것을 확인할 수 있을 것입니다.
plain pointer로는 불가능한 일이죠.
ps. 실은 저는 auto_ptr보다는 boost::shared_ptr을 많이 씁니다. (auto_ptr은
STL의 컨테이너에는 사용될 수 없다는 점이 너무 불편해서요.)
[code:1]struct S{ ~S(
이렇게 해도,
f()에서 예외가 발생하면 S의 소멸자가 호출되는 것을 확인할 수 있는데요.
개념없는 초딩들은 좋은 말로 할때 DC나 웃대가서 놀아라. 응?
함수의 파라메터로 들어가거나, 결과로 나오는 값이 객체일때 유용하겠군요.
함수의 파라메터로 들어가거나, 결과로 나오는 값이 객체일때 유용하겠군요...
복사생성자도 불리지 않구...
WOW Wow!!!
Computer Science is no more about computers than astronomy is about telescopes.
-- E. W. Dijkstra
아 그렇네요한 함수가 heap 에 생성한 객체의 해제를소유권
아 그렇네요
한 함수가 heap 에 생성한 객체의 해제를
소유권 이전을 통해
다른 함수가 하도록 넘겨버리고
신경 끊을때 사용하면 되겠군요
개념없는 초딩들은 좋은 말로 할때 DC나 웃대가서 놀아라. 응?
[quote="girneter"][code:1]struct S
이런 경우에는 auto_ptr을 쓸 이유가 없지요.
S* ptr = new S;
했을 때와 비교해 보세요.
[quote="girneter"]한 함수가 heap 에 생성한 객체의 해
하지만 auto_ptr을 함수 인자로 쓰는 것은 조심하셔야 합니다.
[quote="cinsk"][quote="CN"]동적할당하지 않고 가상함
순간 잘못생각하고 답변을 했네요. 감사합니다.
- 죠커's blog / HanIRC:#CN
[quote="girneter"][code:1]void f(aut
위와같이 사용하는것은 auto_ptr을 잘 못 이해하고 사용하는것과 같습니다.
(조심히 사용해야 하는것과는 별개라 생각이 드네요...)
auto_ptr에서 복사생성자를 호출하거나, 다른 auto_ptr에 대입을 하게되는 경우에 ownership을 이양하게 되어있습니다.
즉
와 같습니다.
즉 함수에 호출시 파라메터로 넘길때 복사해서 넘기게 되는경우에 자신의 ownership을 잃어버리게 되는 것입니다.
만약에 위와같이 함수호출 후에 계속 사용하고 싶다고 할 경우에는,
와 같이, reference로서 념겨야 할 것입니다.
WOW Wow!!!
Computer Science is no more about computers than astronomy is about telescopes.
-- E. W. Dijkstra
댓글 달기