C++摒棄了C中的realloc()函式
阿新 • • 發佈:2019-01-03
在C語言中,realloc()函式可以改變已分配記憶體區的大小。但是在C++中並不提供類似功能的函式。
如果你需要,你當然可以使用realloc()。但是,realloc()僅僅保證能工作於這樣的陣列之上:它們被malloc()(或者類似的函式)分配,包含一些沒有使用者定義的複製建構函式(copy constructors)的物件。而且,要記住,與通常的期望相反,realloc()有時也必須複製它的引數陣列。
在C++中,處理記憶體重新分配的更好的方法是,使用標準庫中的容器,例如vector,並讓它自我增長。
C++裡沒有realloc不是遺憾,而是精心選擇和淘汰的結果。 在C裡,realloc的實現(在增加空間的時候)一般而言是重新分配一塊空間, (這是由堆分配的策略決定的), 然後把舊空間的內容copy到新空間裡去。而物件空間怎麼copy? 是copy位元組還是用copy constructor? 無論哪個都不合適。
那種想在原地(即首地址不動)就把申請記憶體空間擴大的思想不是一個好思想。
所以不要過多糾結於如何在內建陣列或指標基礎上找類似於realloc()函式改變已分配記憶體區大小的函數了。
如果實在想做類似於realloc()函式的操作,可參考如下程式碼:
#include<iostream>
using namespace std;
int main()
{
int *oldbuf=new int[5];
int *newbuf=new int[10];
for(int i=0;i<5;i++)
{
oldbuf[i]=i;
}
copy(oldbuf,oldbuf+5,newbuf);
delete[] oldbuf;
for(i=5;i<10;i++)
{
newbuf[i]=i;
}
for(i=0;i<10;i++)
{
cout<<newbuf[i]<<endl;
}
return 0;
}