2012-02-23 4 views
4

malloc 또는 new를 사용하여 만든 포인터를 반환하는 라이브러리 함수를 거의 사용하지 않습니다. 그래서 어떤 유형의 할당이 사용되었는지에 따라 자체 고객 할당 취소자가 있습니다.shared_ptr에서 deallocator & allocator 사용

예컨대는

shared_ptr<int> ptr1(LibFunctA(), &MallocDeleter); //LibFunctA returns pointer created using malloc 
shared_ptr<int> ptr2(LibFunctB(), &newDeleter); //LibFunctB returns pointer created using new 

지금, 나는이 이상하지만, 다른 어떤 시나리오가 많이 사용되는 역할 당기의 매우 순진 사용을 이해?

또한 고객 할당자는 어떻게 사용할 수 있습니까? 나는 아래와 같이 커스텀 할당자를 할당하려고 시도했다. 그러나 실제로 그것을 어떻게 호출 할 수 있을까? 이러한 종류의 기능은 어디에 도움이됩니까?

shared_ptr<int> ptr3(nullptr_t, &CustomDeleter, &CustomAllocator); //assume both functs are defined somewhere. 
+0

다음은 [더 많은 아이디어] (http://codereview.stackexchange.com/questions/4679/shared-ptr-and-file-for-wrap-cstdio-update-also-dlfcn-h)입니다. –

+0

아마도 : [부스트 shared_ptr : 어떻게 사용자 정의 deleters 및 할당자를 사용하는 방법] (http://stackoverflow.com/q/3378621/33732). –

답변

6

그런 방식으로 삭제자를 사용하는 것에 대해서는 "순진하다"는 것을 볼 수 없습니다. 결국이 기능의 주요 목적입니다. 표준 C++ 메서드를 사용하여 할당되지 않은 포인터 객체를 파괴합니다.

할당 자는 shared_ptr의 제어 블록이 할당되고 삭제되는 방법을 제어해야하는 경우를위한 것입니다. 예를 들어, 이러한 것들을 원하거나 또는 new을 통한 메모리 할당이 허용되지 않는 메모리 제한 상황에 처한 경우 메모리 풀이있을 수 있습니다. 그리고 제어 블록의 타입이 최대 shared_ptr이기 때문에 어떤 종류의 할당자를 제외하고는 어떻게 할당되는지를 제어 할 수있는 다른 방법은 없습니다.

+0

위의 예에서 실제로 ptr3이 새로 할당 된 블록을 가리 키도록하려면 어떻게해야합니까? CustomAllocator 함수를 호출하는 방법을 찾지 못했습니다. Allocator의 작동 예제가 있습니까? –

+0

@FrankQ : 왜 사용자 지정 할당자를 호출합니까? NULL 포인터를주었습니다. 아무것도 저장하라는 말은 아닙니다. 그리고 아무것도 저장하지 않기 때문에 할당 자 중 하나를 할당하는 것이 아닙니다. 또한 Deleter와는 아무 것도 삭제하지 않을 것입니다. –

3

shared_ptr의 사용자 정의 리터럴은 이후에 Freeing 기능을 호출 할 때 필요한 (대개) C 리소스를 래핑하는 데 매우 유용합니다. 예를 들어, 다음과 같이 할 수 있습니다.

shared_ptr<void> file(::CreateFileW(...), ::CloseHandle); 

이와 비슷한 예제는 C 라이브러리에 많이 있습니다. 따라서 나중에 수동으로 리소스를 해제하고 가능한 예외 및 기타 문제를 처리하지 않아도됩니다.

1

커스텀 할당자를 "공유 카운트"객체를위한 공간을 할당하는데 사용하고, deallocator (deleter)와 참조 카운터의 사본을 저장한다고 생각합니다. 사용자 정의 Deleter가가 ...

한 사용을 사용할 수 있습니다 무엇에 관해서는

이미 언급한다 : make ( fclose에 의해 삭제와 같은 FILE) 몇 가지 특별한 기능에 의해 삭제해야합니다 물체와 호환 shared_ptr, 적절한 삭제를 처리하는 도우미 클래스로 래핑하지 않아도됩니다.

사용자 지정 삭제 자의 또 다른 용도는 풀입니다. 풀은 "특별한"삭제 기와 함께 초기화 된 shared_ptr<T>을 전달할 수 있습니다.이 삭제 기는 실제로 아무것도 삭제하지 않지만 대신 객체를 풀에 반환합니다.

또 다른 한 가지 : deleter는 이미 shared_ptr 기능을 구현하는 데 필요합니다. 예 : 삭제 된 유형은 항상 생성시 고정되며 초기화되는 shared_ptr의 유형과는 독립적입니다.

실제로 Derived으로 초기화하여 shared_ptr<Base>을 만들 수 있습니다. shared_ptrBase이 아니고에 가상 dtor이 있어도 개체가 삭제 될 때 Derived으로 삭제된다는 것을 보증합니다.이를 가능하게하려면 shared_ptr은 이미 개체가 삭제되는 방법에 대한 정보를 저장해야합니다. 따라서 사용자가 완전히 사용자 정의 된 Deleter를 지정하도록 허용하면 런타임 성능 측면에서 비용이 들지 않으며 많은 추가 코드가 필요하지 않습니다.

사용자 정의 Deleter를 잘 활용할 수있는 수십 가지 시나리오가 있습니다. 지금까지 내가 생각해 낸 것입니다.

관련 문제