## 8 Smart Pointers

Smart pointers are used extensively in Aspell to simplify memory management tasks and to avoid memory leaks.

### 8.1 CopyPtr

The `CopyPtr` class makes a deep copy of an object whenever it is copied. The `CopyPtr` class is defined in `copy_ptr.hpp`. This header should be included wherever `CopyPtr` is used. The complete definition of the object `CopyPtr` is pointing to does not need to be defined at this point. The implementation is defined in `copy_ptr-t.hpp`. The implementation header file should be included at a point in your code where the class `CopyPtr` is pointing to is completely defined.

### 8.2 ClonePtr

`ClonePtr` is like copy pointer except the `clone()` method is used instead of the copy constructor to make copies of an object. If is defined in `clone_ptr.hpp` and implemented in `clone_ptr-t.hpp`.

### 8.3 StackPtr

A `StackPtr` is designed to be used whenever the only pointer to a new object allocated with `new` is on the stack. It is similar to the standard C++ `auto_ptr` but the semantics are a bit different. It is defined in `stack_ptr.hpp` — unlike `CopyPtr` or `ClonePtr` it is defined and implemented in this header file.

### 8.4 GenericCopyPtr

A generalized version of `CopyPtr` and `ClonePtr` which the two are based on. It is defined in `generic_copy_ptr.hpp` and implemented in `generic_copy_ptr-t.hpp`.