[英]std::allocator<_Ty>::deallocate : cannot convert parameter 1 from 'X' to 'Y'
[英]What is the purpose of the second parameter to std::allocator<T>::deallocate?
這里是deallocate mem的聲明。 分配器類。 我的問題是這個宣言中的第二個論點是什么? 如果這個函數調用operator delete(_Ptr),那么這個參數是不被使用的,那么它的用途是什么?
謝謝。
摘自MSDN:
從指定位置開始的存儲中釋放指定數量的對象。
void deallocate(
pointer _Ptr,
size_type _Count
);
參數
_Ptr指向要從存儲中釋放的第一個對象的指針。
_Count要從存儲中取消分配的對象數。
當你打電話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
這對許多不同類型的分配器很有用。 例如,您可能有一個分配器,它為不同大小的塊使用不同的池; 這樣的分配器需要知道被解除分配的塊的大小是什么,以便它知道返回內存需要哪個池。
它沒有被閑置。
來自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 );
}
(參考分配器文檔中的示例: http : //msdn.microsoft.com/en-us/library/723te7k3.aspx )
我假設分配器不執行新的[]並且不保留已分配元素的數量,因此它不能執行delete []?
所以用戶需要告訴分配的數量和解除分配的數量。
M.
在我看來,它期望_Ptr成為一個對象數組的指針,它基本上是這樣做的:
for (size_type i = 0; i<_Count; i++) {
delete _Ptr;
_Ptr++;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.