When new-ing an array of non-PODs, the compiler needs to store how many elements are in that array, so that it know how many destructors to call on delete. This value is often stored in memory before the array. By extension, this also means that it will allocate a bit more memory than N times sizeof(element), so your original placement new might write over the end of your buffer.
This behaviour is compiler specific, the best advice is to stay away from placement new for non-pod arrays!
If you can't do that, you may need to adapt your implementation for each compiler, so it might be easier to use a vector with a custom allocator.