 <blockquote> <p>With Visual C++, <code>new</code> calls the <code>malloc</code> function.</p> </blockquote> <p>This is partially true: the <code>new</code> expressions in your code do call <code>operator new</code> to allocate memory and <code>operator new</code> does indeed call <code>malloc</code>. But the pointer to the initial element that is yielded by the <code>new</code> expression is not necessarily the pointer obtained from <code>malloc</code>.</p> <p>If you dynamically allocate an array of objects that require destruction (like your <code>CTheClassWith_string</code> type), the compiler needs to keep track of how many elements are in the array so that it can destroy them all when you <code>delete</code> the array.</p> <p>To keep track of this, the compiler requests a slightly larger block from <code>malloc</code> then stores some bookkeeping information at the beginning of the block. The <code>new</code> expression then yields a pointer to the initial element of the array, which is offset from the beginning of the block allocated by <code>malloc</code> by the bookkeeping information.</p>