2009-07-13 6 views
3

먼저 스마트 포인터의 종류가 다양하기 때문에이 질문에 초점을 맞추고 싶습니다. 참조 계산 침입 및 비 침입 스마트 포인터입니다. 질문은 각 포인터 유형에 대해 개별적으로 질문됩니다.스마트 포인터. 언제, 어디서 어떻게?

내 질문을 공식화하는 방법을 잘 모르겠다. 그래서 내가 묻지 않는 것이 여기에있다. 왜 스마트 포인터가 필요한지 묻지 않는다. 어느 유형의 스마트 포인터를 사용해야합니까?

내가 묻는 바는 다음과 같습니다. "현명한 관리"객체를 다룰 때 어떤 포인터 의미를 사용해야합니까? 즉, 스마트 포인터 의미론, 원시 포인터 의미론, 다른 것 (예 : 스마트 포인터 참조)?

글로벌 포인터 나 클래스 멤버와 같은 개체 (개체는 참조 계산 된 메모리 엔터티 임)에 "저장"할 때 스마트 포인터 여야합니다. 소유권을 주장하지만 다른 상황은 어떨까요?

포인터를 함수 인수로 전달할 때 스마트 포인터, 원시 포인터, 스마트 포인터에 대한 참조 또는 다른 뭔가가 있어야합니까? 반환 된 포인터는 무엇입니까? 로컬 포인터? so on ...

물론, 가장 안전한 옵션 인 모든 스마트 포인터를 사용할 수 있지만 실제로는 불필요하며 오버 헤드가 추가됩니다.

+1

감정 scoped_ptr를 힙 사용에 로컬 객체를 생성 할 때 해당 객체

을 변경합니다. 그것을 측정하십시오. –

답변

5

IMHO, 사소한 성능 향상보다 빨리 작업하는 것이 더 나을 때가 있습니다. 항상 스마트 포인터를 사용하면 더 빨리 작업을 수행 할 것이라고 가정합니다.

내 제안 : 모든 곳에서 스마트 포인터를 사용하십시오. 그런 다음 프로파일 러를 사용하여 상당한 오버 헤드가 발생하는지 확인하십시오. 어디서 그것을 변경하십시오 :

0

내 경험에 의하면, 개체에 대한 참조를 저장할 필요가없는 함수에 개체를 전달할 때 (또는 함수를 호출해도 함수에 영향을주지 않습니다. 어떤 식 으로든 객체의 수명), 객체를 참조로 전달하는 것이 안전합니다. 이렇게하면 코드가 스마트 포인터 유형에 "묶이지"않게됩니다. 당신은 "스마트 포인터 의미"와 "원시 포인터의 의미를"대조 tyring 경우 한편

, 항상

2

.... 때 의심 스마트 포인터 타입을 "항상 안전"되어 사용하므로 모든 "스마트 포인터 의미"를 함께 그룹화 할 수 있다고 잘못 가정합니다. 나는 동의하지 않는다. boost::scoped_ptrboost::shared_ptr의 차이는 의미에 대한 boost::shared_ptr bwteeen의 차이와 T*

당신이 "저장"클래스 멤버와 같은 개체에 대한 포인터, 당신이 정말로 말했다하지 않은 많은 같은 크기의 순서이다 . 참조 된 객체가 논리적으로 멤버 ("소유")이면 예, 스마트 포인터가 필요합니다. 그러나 아주 특정한 의미론을 가진 것 : 단일 소유권. 즉, 두 개의 다른 일반적인 스마트 포인터의 이름을 지정하기 위해 공유 된 소유권이나 약한 포인터가 없음을 의미합니다. 반면에 오류 로깅 객체에 대한 포인터를 저장하는 경우 약 포인터가 필요할 수 있습니다. 이렇게하면 종료하는 동안 충돌을 막을 수 있습니다. 로그가 없어지면 weak 포인터가 NULL이됩니다.

마찬가지로 함수에서 포인터를 반환 할 때 대/소문자의 실제 의미에 따라 필요한 포인터 유형이 결정됩니다. 함수에서 반환한다는 단순한 사실이 아닙니다.

4

가능한 한 많이 스마트하거나 다른 방법으로 포인터 사용을 제한하는 것이 좋습니다.나는 당신의 배경을 알지 못한다. 그러나 자바 나 C# 같은 언어에서 오는 많은 사람들은 실제로 값을 사용하고 참조로 호출해야 할 때 포인터를 사용한다. C++ 프로그램에서 포인터를 사용하는 것은 비교적 드뭅니다.

+1

스마트 포인터는 오랫동안 살아야하는 객체가 있고 공유 및/또는 양도가 가능한 소유권이 필요한 경우에 유용합니다. 소유권이 단일 장소에 한정되어 있다면 참고 문헌은 훌륭하고 훌륭합니다. –

+4

오랜 기간 동안 살아야 할 개체가 거의없고 공유하거나 소유권을 이전해야합니다. 대부분의 코드는 수명이 짧은 값을 처리합니다. –

+1

함께 작업하는 코드 종류의 경우 일 수 있습니다. 그것은 내 것이 아니고 여기도 나의 마지막 비 계약직이 아닙니다. (그것은 나의 마지막 계약직의 경우였다.) 누군가가 포인터를 필요로하거나 상황을 다루는 다른 방법이 나쁘다면, 그들은 스마트 포인터를 사용해야한다. –

1

많은 경우 스마트 포인터의 사용은 메모리 관리 및/또는 예외 처리와 관련됩니다. STL auto_ptr은 복잡한 try/catch 환경에서도 깔끔하게 파괴를 관리합니다. 스마트 포인터는 뾰족한 개체의 수명주기를 스마트 포인터에 위임하는 데 유용합니다. 일반적으로 패러다임을 따르기가 어려울 때마다 "당신이 만든 곳에서 당신의 물건을 파괴하십시오"라는 말은 일반적으로 필요합니다. 참조 유형 스마트 포인터는 공유 객체를 쉽게 관리 할 수 ​​없을 때 유용 할 수 있습니다. 좋은 아키텍처로 이런 종류의 문제를 해결하는 것을 선호하지만 스마트 포인터가 가장 좋은 방법 인 경우가 있습니다. 포인터의

2

내 목록 :

  • 정상적인 사용 : 일반 회원들과 그들에게 (const를) 참조
  • 공유 및 객체 살아 (소유자, 용기) 유지 : shared_ptr의
  • 공유,하지만를 살아 (사용자) 유지 : 원시 포인터
:
  • 다른 용도 (출력 매개 변수, ...) scoped_ptr를 :
  • weak_ptr를하는 것은 사용 범위
  • 0
    "When I'm passing a pointer as a function argument, should it be a smart-pointer, a raw 
    pointer, a reference to a smart pointer, or maybe something else? What about returned 
    pointers? Local pointe rs? so on..." 
    

    내 2P, 당신은하지 않습니다 shared_ptrs를 사용하는 명백한 이유가없는 한 :

    함수에서 포인터를 반환하지 마십시오

    는 객체에 대한 참조를, 함수에 대한 포인터를 전달 통과하지 마십시오을 , const가 아닌 참조로 객체를 전달하고 일반적으로 잘못

    +0

    그러나 많은 응용 프로그램에서 shared_ptr <>이 올바르게 수행됩니다. 귀하의 조언은 거의 보편적으로 좋은 것이 아닙니다. –

    +1

    나는 그것이 "명백한 이유가 없다면"조금 다루었다고 생각했다 ... 내 충고는 모든 것을 위해 shared_ptrs를 사용하고자하는 사람을 대상으로한다. – Patrick

    관련 문제