std :: allocator <t> :: deallocate?</t>的第二个参数的目的是什么?

时间:2010-09-08 19:26:49

标签: c++ pointers memory-management

In here是deallocate mem的声明。分配器类。我的问题是这个宣言中的第二个论点是什么?如果这个函数调用operator delete(_Ptr),那么这个参数是不被使用的,那么它的用途是什么呢? 感谢。

摘自MSDN:

从指定位置开始的存储中释放指定数量的对象。

void deallocate(
   pointer _Ptr, 
   size_type _Count
);  

参数

_Ptr 指向要从存储中释放的第一个对象的指针。

_COUNT 要从存储中释放的对象数。

4 个答案:

答案 0 :(得分:7)

当你致电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

这对许多不同类型的分配器很有用。例如,您可能有一个分配器,它为不同大小的块使用不同的池;这样的分配器需要知道被解除分配的块的大小是什么,以便它知道返回内存所需的池。

答案 1 :(得分:5)

它没有被闲置。​​

来自MSDN

  

释放指定数量的对象   从存储开始指定   位置(在这种情况下为_Ptr)。

参数

<强> _Ptr     指向要从存储中释放的第一个对象的指针。 (开始位置)

<强> _COUNT     要从存储中释放的对象数。

Sample code

// 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 );
}

答案 2 :(得分:0)

(参考分配器文档中的示例:http://msdn.microsoft.com/en-us/library/723te7k3.aspx

我假设分配器不执行新的[]并且不保留已分配元素的数量,因此它不能执行delete []?

因此用户需要知道要分配的数量和解除分配的数量。

微米。

答案 3 :(得分:0)

在我看来,它期望_Ptr成为一个指向对象数组的指针,它基本上就是这样做:

for (size_type i = 0; i<_Count; i++) {
    delete _Ptr;
    _Ptr++;
}