&gt; The first mistake is using shared_ptr to begin with.<p>Yes, definitively! Using shared pointers can hide bad design.<p>There are some cases when it is hard to choose the owner of data. Two examples come to my mind. The first are directed graphs: what owns nodes? The second example are parsers, sometimes AST subgraphs must be assigned to extra structures during further processing (type analysis, code generation and so on).