programing

C ++ 11 : 소유하지 않는 모든 원시 포인터를 std :: shared_ptr ()으로 바꾸시겠습니까?

nasanasas 2020. 12. 15. 19:24
반응형

C ++ 11 : 소유하지 않는 모든 원시 포인터를 std :: shared_ptr ()으로 바꾸시겠습니까?


의 출현으로 std::unique_ptr흠집 std::auto_ptr이 마침내 휴식을 취할 수 있습니다. 그래서 지난 며칠 동안 스마트 포인터를 사용하고 코드에서 모든 것을 제거하기 위해 코드를 변경했습니다 delete.

valgrind는 내 코드가 메모리가 깨끗하다고 ​​말하지만 스마트 포인터의 의미 론적 풍부함은 코드를 더 깨끗하고 이해하기 쉽게 만듭니다.

사용 : 대부분의 코드에서, 번역은 간단하다 std::unique_ptr소유하는 객체에 의해 개최 된 원시 포인터 대신에, 밖으로 던져에 대한 delete조심스럽게 뿌려 get(), reset()move()호출, 필요에 따라 코드의 나머지 부분과 잘 인터페이스.

나는 소유하지 않은 원시 포인터 를 스마트 포인터로 변환하는 시점에 있습니다.

객체의 수명에주의를 기울 였기 때문에 (모듈이 한 방향으로 만 의존하도록 보장) valgrind는 초기화되지 않은 읽기, 매달린 포인터 또는 누출이 없다고 알려줍니다. 따라서 기술적 으로는 소유하지 않는 원시 포인터를 지금 은 그대로 둘 수 있습니다 .

그러나 한 가지 옵션은 소유하지 않은 원시 포인터std::shared_ptr비순환이라는 것을 알고 있기 때문에 변경하는 것 입니다. 아니면 원시 포인터로 두는 것이 더 낫습니까?

나는 계속 여부를 결정하기 위해 당신은 무엇을 사용 엄지 손가락의 규칙에 스마트 포인터의 베테랑 사용자의 조언을 필요로 원시 포인터를 비 소유 그대로, 또는로 번역 std::shared_ptr, 염두에두고 그 I 지속적으로 단위 테스트 및 Valgrind의 내 암호.

편집 : 나는 사용을 오해 std::shared_ptr할 수 있습니다-와 함께 std::unique_ptr사용할 std::shared_ptrstd::shared_ptr있습니까 , 아니면 사용 하면 모든 핸들도 있어야 합니까?


개인적으로, 이것이 내가하는 방법입니다.

  • unique_ptrs 는 단독 소유권입니다.
  • 원시 포인터 는 나에게 원시 포인터를 준 사람이 해당 개체의 수명이 내 수명과 일치하거나 초과하도록 보장한다는 것을 의미합니다.
  • shared_ptrs 는 공유 소유권을위한 것입니다.
  • weak_ptrs 는 사용하기 전에 시스템이 개체가 아직 존재하는지 확인하려는 경우에 사용됩니다. 내 코드에서는 시스템이 전달하는 모든 항목의 수명을 보장하는 시스템이 더 깨끗하다는 것을 알기 때문에 코드에서 드뭅니다 (이 경우 원시 포인터를 사용합니다).

지금까지 shared_ptrs보다 unique_ptrs를 더 많이 사용하고 약한 포인터보다 원시 포인터를 더 많이 사용합니다.


shared_ptr여러 항목이 리소스를 소유해야 할 때 사용하고 (그리고 소유하는 항목은 "무작위"에서 범위 내외로 이동할 수 있음), unique_ptr단일 항목이 리소스를 소유 할 때 a를 사용 하고, 참조 할 필요가있을 때 원시 포인터를 사용합니다. 소유하고 있지 않습니다 (그리고이 추천이 자원이 존재하는 것보다 오래 지속되지 않을 것으로 예상).

네 번째 유형, 일종의 원시 포인터 for- shared_ptr라고하는 weak_ptr. 당신은 shared_ptr그것을 실제로 소유하지 않고 참조하기 위해 그것을 사용합니다. 그런 다음 개체가 아직 있는지 확인하고 사용할 수 있습니다.


표준 라이브러리에서 소유하지 않는 유일한 스마트 포인터는 std::weak_ptr. 그러나 그것을 사용하려면 실제 소유 객체가 std::shared_ptr.

나는 당신 std::unique_ptr이 전에 그것을 사용했다고 가정합니다 . 이를 shared_ptr지금으로 변환하면 소유하지 않은 포인터가 손실 된 소유 포인터가 참조라는 것을 알 수있는 반면, 소유하지 않는 구성 요소가이를 감지 할 기회없이 원시 포인터를 매달린 채로 둘 수 있다는 이점을 얻을 수 있습니다. 그러나 shared_ptr.NET을 통해 (매우?) 작은 성능과 메모리 오버 헤드가 발생 unique_ptr합니다.

개인적으로, 나는 하나를 사용하는 것이 좋습니다 shared_ptr많은 weak_ptr의 하나가 아닌 unique_ptr및 일반적인 경우 많은 원시 포인터 사용을 unique_ptr당신이 정말로 성능 문제가있는 경우!

참조 URL : https://stackoverflow.com/questions/8338570/c11-replace-all-non-owning-raw-pointers-with-stdshared-ptr

반응형