 <p>Option 1 using pointers is a bad idea. Use either <code>boost::scoped_ptr</code> or, if you can, <a href="http://herbsutter.com/elements-of-modern-c-style/" rel="nofollow"><code>std::unique_ptr</code></a>.</p> <p>Option 2, as you implement it, should not be used. See <a href="http://www.gotw.ca/gotw/028.htm" rel="nofollow">GotW #28: The Fast Pimpl Idiom</a>. In C++11 however, this can be done correctly using <code>std::aligned_storage&lt;&gt;</code>. I once wrote a <code>pimpl_ptr&lt;T, Size, Align=default&gt;</code> that does the casting, copying, destructor call for you and checks that you have chosen the right <code>Size</code>.</p> <p>In general, use pimpl unless you have profiled and shown that this is the bottleneck.</p> <p>But as always, don't reinvent the wheel. Mutex and Threads are part of the new C++11 standard, so either upgrade the compiler or use Boost instead. For files use Boost. The reasoning is, that many parts of the new C++11 library are taken from Boost.</p>