Какова цель второго параметра для std :: allocator <T>:: deallocate? - PullRequest
4 голосов
/ 08 сентября 2010

Здесь - объявление освобождения памяти.класса распределителя.Мой вопрос: зачем второй аргумент в этой декларации?Если эта функция вызывает оператор delete (_Ptr), этот аргумент не используется, так зачем он здесь?
Спасибо.

Выдержка из MSDN:

Освобождает указанное количество объектов от начала хранилищав указанной позиции.

void deallocate(
   pointer _Ptr, 
   size_type _Count
);  

Параметры

_Ptr Указатель на первый объект, который должен быть освобожден из хранилища.

_Count Количество объектов, которые должны быть освобождены из хранилища.

Ответы [ 4 ]

7 голосов
/ 08 сентября 2010

Когда вы вызываете deallocate, вы должны дать ему указатель, который вы ранее получили при вызове allocate, и размер, который вы передали allocate, когда вы изначально выделяли память.

Например,

#include <memory>

std::allocator<int> a;
int* p = a.allocate(42);
a.deallocate(p, 42);     // the size must match the size passed to allocate

Это полезно для многих различных типов распределителей. Например, у вас может быть распределитель, который использует разные пулы для блоков разных размеров; такой распределитель должен был бы знать, каков размер освобождаемого блока, чтобы он знал, в какой пул он должен вернуть память.

5 голосов
/ 08 сентября 2010

Он не используется.

С MSDN :

Освобождает указанное количество объектов из хранилища , начиная с указанной позиции(В данном случае _Ptr).

Параметры

_Ptr Указатель на первый объект, который должен быть освобожден из хранилища.(начальная позиция)

_Count Количество объектов, подлежащих освобождению из хранилища.

Пример кода :

// allocator_allocate.cpp
// compile with: /EHsc
#include <memory>
#include <iostream>
#include <vector>

using namespace std;

int main( ) 
{
   allocator<int> v1Alloc;

   allocator<int>::pointer v1aPtr;

   v1aPtr = v1Alloc.allocate ( 10 );

   int i;
   for ( i = 0 ; i < 10 ; i++ )
   {
      v1aPtr[ i ] = i;
   }

   for ( i = 0 ; i < 10 ; i++ )
   {
      cout << v1aPtr[ i ] << " ";
   }
   cout << endl;

   v1Alloc.deallocate( v1aPtr, 10 );
}
0 голосов
/ 08 сентября 2010

Мне кажется, что он ожидает, что _Ptr будет указателем на массив объектов, и что он в основном делает:

for (size_type i = 0; i<_Count; i++) {
    delete _Ptr;
    _Ptr++;
}
0 голосов
/ 08 сентября 2010

(см. Пример в документации для распределителя: http://msdn.microsoft.com/en-us/library/723te7k3.aspx)

Я предполагаю, что распределитель не выполняет новый [] и не сохраняет количество выделенных элементов, поэтому он не может удалить []?

поэтому пользователю необходимо указать, сколько выделить и сколько освободить.

М.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...