Я читал о C++ распределителей и deallocate функция имеет предложение, что привлекло мое внимание:станд :: Распределитель DEALLOCATE часть памяти
Аргумент п должен быть равен первому аргументу вызова выделить() первоначально произведенный р; в противном случае поведение не определено.
Почему это? Почему бы не один DEALLOCATE часть выделенной памяти, глупый пример:
#include <memory>
#include <string>
int main()
{
std::allocator<std::string> alloc;
auto const p = alloc.allocate(20);
alloc.deallocate(p+10, 10);
return 0;
}
Не уверен, что смысл вы спрашиваете: «Почему». Вы спрашиваете: «Почему сегодня эта работа не работает?» или вы спрашиваете: «Почему стандарт не требовал от распределителей поддержки частичного освобождения?» Это не работает сегодня, потому что стандарт так говорит. Почему стандарт так говорит? Вероятно, потому, что стандарт хотел соответствовать существующей практике. –
Если вы это сделали, диспетчер памяти потеряет информацию о том, какая память была защищена (и используется), а какая нет. Существует связанный список структур, занимающих положение и размер каждого блока выделенной памяти, идущий на ** p + 10 ** пропускает эту информацию. –