 <blockquote> <p>It seems when you try to add more elements to it, and it needs to allocate more space, it does so by copying the last element it currently holds. This seems to assume that any element in the vector is fully valid, and as such a copy will always succeed.</p> </blockquote> <p>Both sentences are not really correct. When vector runs out of space it, yes, performs reallocation, but of <em>all</em> the elements and these are copied to the new location or <em>possibly</em> moved. When you <code>push_back</code> or <code>emplace_back</code>, and reallocation is needed, the element will generally by copied: if an exception is thrown during that, it will be treated as if you had never added the element. If <code>vector</code> detects a <code>noexcept</code> user-defined move constructor ( <code>MoveInsertable</code> concept), elements are moved; if this constructor though is not <code>noexcept</code>, and an exception is thrown, the result is unspecified.</p> <blockquote> <p>The objects have guards, but I never considered adding guards to a copy constructor as I assumed we would never be copying an invalid object (which vector forces) :</p> </blockquote> <p><code>vector</code> copies its <code>value_type</code>: it does not care whether what it <em>contains</em> is valid or invalid. <strong>You</strong> should take care of that in your copy control methods, whose scope is exactly to define how the object is passed around.</p> <hr> <pre><code>CopiedClass::CopiedClass(const CopiedClass&amp; other) : member(other.member) { member-&gt;DoSomething(); } </code></pre> <p>The obvious solution would be to check if <code>member</code> is valid and act thereby. </p> <pre><code>if (member.internalData.isValid()) member-&gt;DoSomething() // acknowledge this.member's data is invalid </code></pre> <p>We don't know how <code>member</code> is represented, but <a href="http://www.boost.org/doc/libs/1_59_0/libs/optional/doc/html/index.html" rel="nofollow">Boost.Optional</a> is what you may be looking for.</p> <blockquote> <p>Is it possible to prevent std::vector from copying that element?</p> </blockquote> <p>Reallocation is something <code>vector</code> is <em>expected</em> to commit so, no, you can't. <code>reserv</code>-ing space could avoid that, but maintaining code to handle that would not really be painless. Rather, prefer a container like <code>std::forward_list</code>/<code>std::list</code>.</p> <p>Other solutions:</p> <ul> <li>Hold a <code>unique_ptr&lt;decltype(member)&gt;</code>, but pointers are not often a real solution</li> <li>Define move semantics for your object, as described in other answers.</li> </ul>