It seems if you have an array of pointers, and attempt: object* TheArray[2]; TheArray[x] = (object*) malloc(NUM * sizeof(object)); new (TheArray[x] + num) object(...); The check uses size of TheArray (16 bytes), and not the large allocation which TheArray[x] points to. Known bug? Easy to work around with a temp variable at least. error: placement new constructing an object of type '...' and size '120' in a region of type 'object* [2] {...* [2]}' and size at most '16' [-Werror=placement-new=]