Следует учитывать, что operator new[]
может вызываться с запросом большего количества памяти, чем необходимое количество sizeof(T) * n
.
Эта дополнительная память, возможно, необходима, потому что C ++ должен знать, сколько объектов нужно уничтожить в случае delete[] p;
, но он не может надежно использовать размер блока памяти, выделенного new p[sz]
, чтобы вывести это число, потому что память, возможно, была запрошена в специализированный диспетчер памяти, поэтому (например, ваш случай) нет способа узнать, сколько памяти былораспределяется только путем знания указателя.
Это также означает, что ваша попытка предоставить уже инициализированные объекты потерпит неудачу, потому что фактически массив, возвращенный приложению, потенциально не будет начинаться с адреса, который вы вернули из своего пользовательского operator new[]
чтобы инициализация могла быть смещена.