title: What are the limitations of overloading, overriding and replacing new/delete?
body: <p>I understand that there are <a href="https://stackoverflow.com/questions/5104861/putting-restrictions-in-overloading-new-and-delete">3 general ways</a> to modify the behaviour of new and delete in C++:</p>
  
  <ul>
  <li><em>Replacing</em> the default new/delete and new[]/delete[]</li>
  <li><em>Overriding</em> or <em>overloading</em> the placement versions (overriding the one with a memory location passed to it, overloading when creating versions which pass other types or numbers of arguments)</li>
  <li><em>Overloading</em> class specific versions.</li>
  </ul>
  
  <p>What are the restrictions for performing these modifications to the behaviour of new/delete?</p>
  
  <p>In particular are there limitations on the signatures that new and delete can be used with?</p>
  
  <p>It makes sense if any replacement versions must have the same signature (otherwise they wouldn't be replacement or would break other code, like the STL for example), but is it permissible to have global placement or class specific versions return smart pointers or some custom handle for example?</p>