In here是deallocate mem的声明。分配器类。我的问题是这个宣言中的第二个论点是什么?如果这个函数调用operator delete(_Ptr),那么这个参数是不被使用的,那么它的用途是什么呢? 感谢。
摘自MSDN:
从指定位置开始的存储中释放指定数量的对象。
void deallocate(
pointer _Ptr,
size_type _Count
);
参数
_Ptr 指向要从存储中释放的第一个对象的指针。
_COUNT 要从存储中释放的对象数。
答案 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 强> 要从存储中释放的对象数。
// 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++;
}