You should be using a raw pointer, period. The list&#x2F;tree destructor must be responsible for traversing and deleting the whole structure.<p>If you have a linked list of, say, 10M elements linked by  unique_ptr, deleting the head of the list would cause <i>recursive</i> [1] destruction of all elements in the list. Stack overflow, CRASH, BOOM, BANG!<p>[1] Take a simple example of list A -&gt;a B -&gt;b C -&gt;c 0 where arrows are unique_ptrs owned by the nodes. Deleting A must invoke the destructor for -&gt;a , which will delete B, invoking the destructor for -&gt;b, which will delete C invoking the destructor for -&gt;c which is null, thus finishing the recursion.<p>EDITS: added labels to pointers for clarity.