Гарантировано ли, что std :: vector, каждая выделенная память с функцией выделения, также будет освобождаться сразу, с одним вызовом освобождения?
0 user1289 [2016-09-23 12:36:00]
Я пишу пользовательский распределитель для std :: vector и хочу знать, как std :: vector использует указанный распределитель? Пусть он выделит память для 5 объектов, а затем освободит память частично, например, сначала 2 элемента, затем 3 элемента... (Я не вижу причин, чтобы этого не делать).
Есть ли что-нибудь об этом в стандарте? Я ничего не мог найти.
c++ memory-management vector stl allocator
1 ответ
4 Решение legends2k [2016-09-23 12:43:00]
Гарантировано ли, что
std::vector
каждая выделенная память с функцией выделения, также будет освобождаться сразу, с одним вызовом освобождения?
Да. Прототипом std::allocator::deallocate
является
void deallocate( pointer p, size_type n );
Пусть он выделит память для 5 объектов, а затем освободит память частично, например, сначала 2 элемента, затем 3 элемента... (Я не вижу причин, чтобы этого не делать).
Но n
не может отличаться от того, что было передано ранее соответствующей функции allocate
, как объясняется в спецификации. :
Отменяет память, на которую ссылается указатель p, который должен быть указателем, полученным более ранним вызовом allocate(). Аргумент n должен быть равен первому аргументу вызова allocate(), изначально созданного p.
В принципе, аргументы для deallocate
- все, что было возвращено путем
allocate
- соответствующее
n
которое было передано для его получения