2016-04-25 2 views
1

Я читал о 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; 
} 
+2

Не уверен, что смысл вы спрашиваете: «Почему». Вы спрашиваете: «Почему сегодня эта работа не работает?» или вы спрашиваете: «Почему стандарт не требовал от распределителей поддержки частичного освобождения?» Это не работает сегодня, потому что стандарт так говорит. Почему стандарт так говорит? Вероятно, потому, что стандарт хотел соответствовать существующей практике. –

+0

Если вы это сделали, диспетчер памяти потеряет информацию о том, какая память была защищена (и используется), а какая нет. Существует связанный список структур, занимающих положение и размер каждого блока выделенной памяти, идущий на ** p + 10 ** пропускает эту информацию. –

ответ

1

Некоторые распределители могут быть в состоянии сделать это. Спецификация C++ только говорит, что все реализация абстрактного интерфейса распределителя, Alloc<T>, требуется. Комитет решил не требовать того, о чем вы спрашиваете.

Я не имею C++ Обоснования на этом компьютере, но я подозреваю, что функция вы спрашиваете не требуется, так как функции распределителей памяти C (malloc и free) не могут это сделать, и C++ комитет хотел, чтобы было возможно реализовать библиотеку C++ поверх библиотеки C.

да, realloc может сделать некоторые случаи это, но не все из них

+0

Быть немного педантичным, но realloc технически не может гарантировать то, что задано в любом случае, так как realloc может перемещать память [_even если его сделано меньше_] (http://stackoverflow.com/questions/1736433/can-realloc-move- указатель, если новый размер-меньше) –

Смежные вопросы