This is a generic scoped class for managing the lifetime of objects allocated on freestore.
More...
template<class T, class Dealloc>
class Cgu::ScopedHandle< T, Dealloc >
This is a generic scoped class for managing the lifetime of objects allocated on freestore.
- See Also
- SharedHandle SharedLockHandle SharedHandleError
-
StandardArrayDelete CFree GFree GerrorFree GSliceFree GSliceFreeSize GSliceDestroy
This class deletes its object as soon as it goes out of scope. It can be viewed as a SharedHandle which cannot be assigned to or used as the argument to a copy constructor and therefore which cannot have a reference count of more than 1.
ScopedHandle objects can be instantiated for pointers to constant objects (such as ScopedHandle<const char*>), provided the deleter functor will take such pointers.
This library provides StandardArrayDelete, CFree, GFree, GerrorFree, GSliceFree, GSliceFreeSize and GSliceDestroy deleter functors, which can be used as the second template parameter of the ScopedHandle class. StandardArrayDelete is the default, and some typedef'ed instances of ScopedHandle for gchar (with the GFree deleter) and for GError (with the GerrorFree deleter) are provided: GcharScopedHandle and GerrorScopedHandle)
Comparison with std::unique_ptr
Although the semantics of std::unique_ptr in C++11 are not particularly suited to managing C objects with accessor functions (such as in glib), most of the things that can be done by this class can be done by using std::unique_ptr with a specialised deleter. However, this class is retained in the c++-gtk-utils library not only to retain compatibility with series 1.2 of the library, but also to cater for some cases not so easily met by std::unique_ptr:
- The Cgu::ScopedHandle class takes its deleter as a template parameter, which means that typedefs can be used to enable handles for particular deleters to be easily created (and as mentioned, this library provides a number of pre-formed deleter functors and typedefs for them). With std::unique_ptr, custom deleters must be passed to the unique_ptr constructor on every occasion a unique_ptr is constructed to manage a new object (and they cannot be templated as a typedef).
- This class provides non-move enforcement without making a const instance of it. A const std::unique_ptr cannot be moved from or to, but then it cannot have release() or reset() called for it either.