일반적인 C++ 디자인에서 대부분의 객체는 delete
문, free
함수 또는 free
과 같은 라이브러리 특정 함수로 삭제할 수 있습니다. 이러한 객체의 경우 unique_ptr
Deleter
구현은 빈 기본 클래스 최적화를 통해 제거되는 상태없는 객체가 될 수 있습니다. 그러나 일부 라이브러리는 라이브러리에서 오브젝트를 삭제하기 위해 다른 오브젝트 (함수 포인터 또는 기타 컨텍스트를 포함 할 수 있음)를 사용해야합니다.unique_ptr deleter overhead
typedef struct lib_object lib_object;
struct lib_api {
lib_object (*createInstance)();
void (*freeInstance)(lib_object *o);
};
하나 맞춤 Deleter
에서 데이터 부재로서의 lib_api
포인터를 저장함으로써 unique_ptr
이 포장 할 수도 있지만 필요 lib_object
다중 인스턴스를 관리 할 경우, 예를 들어 컨테이너에서 객체 추적의 메모리 오버 헤드를 두 배로 늘릴 수 있습니다. 이 라이브러리를 다룰 때 어떤 종류의 패턴을 사용하여 RAII 원칙을 유지하면서 메모리를 효율적으로 사용할 수 있습니까?
'lib_api *'를 deleter 클래스의 정적 멤버로 만들 수 있습니까? – Brian
컨테이너 클래스의 사용자 정의 파생 클래스에'freeInstance'를 저장하고 컨테이너에'lib_object *'가 포함되어야한다고 생각합니다.파생 클래스에서 모든 요소에 대해'freeInstance'를 호출하는 소멸자를 구현해야합니다. – Franck