Object pools can be implemented in an automated fashion in languages like C++ via [[Smart pointer|smart pointers]]. In the constructor of the smart pointer -, an object can be requested from the pool, and in the destructor of the smart pointer -, the object can be released back to the pool. In garbage-collected languages, where there are no destructors (which are guaranteed to be called as part of a stack unwind) -, object pools MUST''must'' be implemented in a manual fashionmanually, by explicitly requesting an object from the [[Factory (object-oriented programming)|factory]] and returning the object by calling a dispose method (as in the [[dispose pattern]]). Using a [[finalizer]] to do this is not a good idea, as there are usually no guarantees on when (or if ever) the finalizer will be run. Instead, - prefer using "try ... finally" should be used to ensure that getting and releasing the object is exception-neutral.
Manual object pools are simple to implement, but harder to use, as they require [[manual memory management]] of pool objects.