2010-09-08 54 views
4

In here是deallocate mem的声明。的分配器类。我的问题是这个声明中的第二个参数是什么?如果这个函数调用operator delete(_Ptr),那么这个参数是未使用的,那么它在那里呢?
谢谢。从MSDN第二个参数std :: allocator的用途是什么<T> :: deallocate?

摘录:

释放所有从存储在指定的位置开始对象的指定数。

void deallocate(
    pointer _Ptr, 
    size_type _Count 
); 

参数

_Ptr 的指针第一对象将被从存储解除分配。

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

+0

你能引用至少部分的链接?如果该特定MSDN引用移动或消失或暂时不可用,则该问题将无法理解。 (我以前遇到过破碎的MSDN链接。) – 2010-09-08 19:44:53

回答

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 

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

+0

@A-ha:这取决于分配器在引擎盖下做什么。在缺省分配器('std :: allocator ')中,大小被忽略,'deallocate'函数简单地执行':: operator delete(p);'。其他分配器可能会有不同的表现。 – 2010-09-08 19:51:17

+0

@James所以例如我可以取消分配字节数?我应该使用什么构造?我的意思是如何实现看起来像? – 2010-09-08 19:55:25

+0

@阿哈:你什么意思?您需要使用'std :: allocator ',分配'count'字节,然后调用'deallocate'来释放该内存。 – 2010-09-08 19:58:32

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); 
} 
+0

但是不要释放内存(在这种情况下不需要第二个参数)而不调用对象的dtors?我以为摧毁是为了那个妓女。 – 2010-09-08 19:39:21

+0

是的,就是这样。它释放内存,但是它更进一步,并允许您在这种情况下仅释放内存的一部分。 – 2010-09-08 19:42:06

+0

如果您要引用来自第三方来源的文本或代码,请引用来源,以便人们知道它来自何处。 – 2010-09-08 19:42:18

0

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

我认为分配器没有做新的[]和不保留的分配数量元素,所以它不能做一个删除[]?

所以用户需要告诉要分配的数量以及要分配的数量。

M.

0

在我看来,它的预期_Ptr是一个指针指向对象的数组,而且它基本上是这样做的:

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

不可以。指针必须是从先前调用allocate获得的指针,并且大小必须是获取该指针时传递给allocate的大小。 – 2010-09-08 19:43:01

+0

你是在做一个'_Ptr'为'new type [size]'的建议吗?那么你不能像你说的那样删除它,你必须使用'delete []'。 – 2010-09-08 20:09:58

相关问题