C++ std::allocator<;的第二个参数的用途是什么;T>;::解除分配?

C++ std::allocator<;的第二个参数的用途是什么;T>;::解除分配?,c++,pointers,memory-management,C++,Pointers,Memory Management,是释放内存的声明。分配器类的。我的问题是,这个宣言的第二个论点是什么?如果此函数调用运算符delete(_Ptr),则此参数未使用,那么它的作用是什么? 谢谢 摘自MSDN: 从指定位置开始从存储器中释放指定数量的对象 void deallocate( pointer _Ptr, size_type _Count ); 参数 _Ptr 指向要从存储器中解除分配的第一个对象的指针 _计数 要从存储中释放的对象数。它不是未使用的 发件人: 释放指定数量的对象 从存储开始,从指定的

是释放内存的声明。分配器类的。我的问题是,这个宣言的第二个论点是什么?如果此函数调用运算符delete(_Ptr),则此参数未使用,那么它的作用是什么?
谢谢

摘自MSDN:

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

void deallocate(
   pointer _Ptr, 
   size_type _Count
);  
参数

_Ptr 指向要从存储器中解除分配的第一个对象的指针

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

它不是未使用的

发件人:

释放指定数量的对象 从存储开始,从指定的 位置(本例中为Ptr)

参数

\u Ptr 指向要从存储器中解除分配的第一个对象的指针。(起始位置)

\u计数 要从存储中释放的对象数

:

//分配器\u allocate.cpp
//使用:/EHsc编译
#包括
#包括
#包括
使用名称空间std;
int main()
{
分配器v1Alloc;
分配器::指针v1aPtr;
v1aPtr=v1Alloc.allocate(10);
int i;
对于(i=0;i<10;i++)
{
v1aPtr[i]=i;
}
对于(i=0;i<10;i++)
{
cout(参考文档中分配器的示例:)

我假设分配器不执行新[],也不保留已分配元素的数量,因此无法执行删除[]

因此,用户需要告诉分配多少和取消分配多少


M.

在我看来,它期望Ptr是指向一个对象数组的指针,它基本上在做:

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

对于(size_type i=0;i当您调用
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
#包括
分配器a;
int*p=a.allocate(42);
a、 解除分配(p,42);//大小必须与传递给分配的大小匹配

这对于许多不同类型的分配器都很有用。例如,您可能有一个分配器,它对不同大小的块使用不同的池;这样的分配器需要知道要释放的块的大小,以便知道需要将内存返回到哪个池。

但不应该释放,只会释放内存(在这种情况下,不需要第二个参数)不调用对象的DTR?我以为destroy就是为了这个目的。是的,它就是这样做的。它释放内存,但在这种情况下,它更进一步,只允许释放一部分内存。如果你要引用第三方来源的文本或代码,请引用源代码,以便人们知道它来自哪里。@James McN埃利斯:只是添加了源代码。有时我会忘记添加源代码。我会尽可能多地添加源代码。谢谢你的评论。这个答案仍然是错误的(或者至少是令人困惑的),不过:对于默认的分配器(
std::allocator
),size参数未使用。否。指针必须是从以前调用
分配
中获取的指针,并且大小必须是获取该指针时传递给
分配
的大小。您是否按照建议使用
\u Ptr
将其作为
新类型[大小]
那么你不能像你说的那样删除它,你必须使用
delete[]
。你能引用该链接的至少一部分吗?如果特定的MSDN参考移动或消失或暂时不可用,这个问题将无法理解。(我以前遇到过断开的MSDN链接。)@A-ha:这取决于分配器在引擎盖下做什么。对于默认分配器(
std::allocator
),大小将被忽略,
deallocate
函数只执行
::操作符删除(p)
。其他分配器的行为可能会有所不同。@James那么,例如,我如何才能取消分配字节数?我应该使用什么construct?我的意思是,实现会是什么样子?@A-ha:什么意思?您需要使用
std::分配器
,分配
计数
字节,然后调用
deallocate
来取消分配詹姆斯,但是如果我使用分配(计数),那么我可以使用取消分配(where)如果不指定字节数,那么这样做有什么意义?@A-ha:std::allocator
只是默认分配器;它还定义了其他分配器需要遵循的接口,以便标准库容器使用。默认分配器不使用该大小。其他分配器实现在离子(例如池分配器)。
#include <memory>

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