 <p>The first 5 constructor calls are clear. Then there 3 destructor calls. The first <code>c</code> array was declared inside a block:</p> <pre><code>{ C c[2] //... } // objects in c are destroyed </code></pre> <p>When the block is left then all objects that were created non-dynamically inside the block are destroyed by calling their destructor. So there is the first destructor call from your <code>delete p2</code> and then two other destructor calls for destroying the two objects contained in the array. The same holds for the last four destructor calls at the end: the first destructor call os from your <code>delete p1</code> and the other three destructor calls are for the <code>C c[2]</code> that was declared outside the block and for destroying the <code>c1</code> object.</p>