1. 程式人生 > >C++摒棄了C中的realloc()函式

C++摒棄了C中的realloc()函式

在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;
}