Гарантировано ли, что 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

  1. все, что было возвращено путем allocate
  2. соответствующее n которое было передано для его получения