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_ptr
수 std::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
당신이 정말로 성능 문제가있는 경우!
'programing' 카테고리의 다른 글
border-radius + background-color == 잘린 테두리 (0) | 2020.12.15 |
---|---|
정수 값의 필수 속성 (0) | 2020.12.15 |
XPath-node ()와 text ()의 차이점 (0) | 2020.12.15 |
angularjs 앱에서 안전한 (!) 인증 시스템을 달성하는 방법은 무엇입니까? (0) | 2020.12.15 |
Java HashMap의 충돌 해결 (0) | 2020.12.15 |