2016-08-30 2 views
0

를 초기화하는 인터페이스 추가 기능 : 클래스 내부인터페이스 기능이있어 내가 클래스가 그것을 통해 노출이 shared_ptr의

void AddObject(Object *o); 

나는 set<shared_ptr<Object>>의 개체를 유지합니다. 받은 포인터로부터 shared_ptr을 생성 할 것이므로 함수 인수를 rvalue 포인터로 제한하여 사용자가 사용하는 포인터를 삭제하지 않을 것이라고 생각했습니다.

void AddObject(Object* &&o); 

그래서 일반적인 사용이 될 것입니다 : 그래서 난에 함수 선언을 변경할 수 있습니다

AddObject(new Object()) 

실수로 내가 잡아 포인터를 삭제하는 사용자를 방지 할 수있다. 사용자가 shared_ptr에 익숙하지 않기 때문에 인터페이스에 shared_ptr을 사용하고 싶지 않습니다. 제 제안은 좋은 생각이라고 생각하십니까?

+0

'std :: unique_ptr '의 문제점은 무엇입니까? – AndyG

+0

그 대신에 unique_ptr을 쓰면 똑같은 질문이 적용됩니다. –

+0

'unique_ptr'을 사용하면 인터페이스에서 좀 더 분명하게 나타납니다. 또한,'move' 의미 체계는 이미 전달되고 있으므로,'unique_ptr'을'std :: move '하는 것은 자연스럽지 만 원시 포인터를'std :: move'하는 것은 정말 이상합니다. – AndyG

답변

0

나는 이것이 나쁜 생각이라고 생각합니다. 난 원시 포인터를 얻는 shared_ptr c-tor가 r-value를 사용하는 대신 명시 적으로 표시되는 이유가있을 것이라고 확신합니다. 내 눈에는 스마트 포인터에 관해 한 번만 가르치거나 적어도 make_shared/make_unique (더 안전하고 더 효율적이며 BTW의 경우 make_shared 인 경우)을 사용하는 것이 좋습니다.

왜, shared_ptr이고 unique_ptr이 아닌 이유는 무엇입니까?

또한 이유는 set? 각 포인터를 한 번만 잡고 코드가 자연스럽게 보이지 않을 때마다 vector을 검색하려고해도 unordered_set 대신 포인터를 정렬하는 이유가 표시되지 않습니다.

0

우선이 방법은 사용자가 포인터를 삭제하지 못하게합니다. 둘째 예

auto obj = new Object(); 
    AddObject(std::move(obj)); 
    delete obj; 

을 고려 new를 호출 shared_ptr의 생성이 가능한 한 적은 수 있어야 단계 사이의 양. shared_ptr을 생성하기 전에 AddObject 내부에서 아무 일도 일어나지 않으면 개체가 절대로 삭제되지 않습니다.

AddObject()에 더 많은 인수가있는 경우에도 마찬가지입니다. 그것들을 생성하는 것이 실패하면, 당신은 메모리를 누출하게 될 것이다.

void AddObject(Object* &&o, SomeOtherObject* x); 

    AddObject(new Object(), xx()); // if xx() throws, memory leak will occur 

이상적으로 당신은 객체가 shared_ptr 건설로 만드는 "포장"할 다음 방법 중

void AddObject(std::shared_ptr<Object> o); 

    AddObject(std::make_shared<Object>()); 
+0

첫 번째 예제는 실제로 제공된 포인터를 사용자가 삭제할 수있는 방법을 보여 주지만 악의적 인 사용자 만이 수행 할 수 있도록 명시 적입니다. –

0

중 하나를 문제를 해결할 수 있습니다.

  1. AddObject에 대해 더 많은 설명을 추가하여 추가 한 포인터를 삭제할 수 없다고 사용자에게 알릴 수 있습니다. 이것은 거의 충분합니다.
  2. 또는 소 유자 소멸자 및 destroyByOwner이라는 메서드가있는 기본 클래스에서 Object을 상속 할 수도 있습니다.
관련 문제