2012-03-06 134 views
2

可能重複:
How do you realloc in C++?重新分配C++數組的內存。

我知道C++陣列可重新分配(擴)使用realloc()如果存儲器已經經由malloc()calloc()分配。我的問題是,如何擴展C++中的數組,其內存已通過new運算符分配?

+0

malloc/realloc是C庫調用 - 儘管它們可以在C++中使用,但它們通常應該避免使用,因爲C++具有更強大的處理動態數組的方式等。 – 2012-03-06 15:17:35

回答

11

你不能 - 這就是爲什麼你在C++中使用std::vector<>

如果你想這樣做,你必須分配一個新的數組(通過new),然後複製舊的項目(例如std::copy),然後delete[]前一個數組。

只需使用std::vector - 讓它做所有的東西你...

+3

對於std :: vector。 – 2012-03-06 15:14:53

+1

「然後複製舊的項目」 - 或移動它們。 – 2012-03-06 15:36:03

4

一般而言,即使存儲被分配了malloc,C++數組也不能被重新分配爲reallocmalloc不會給你陣列。它給出了可用存儲的指針。這裏有一個微妙的區別。

對於POD類型,可用存儲和實際對象之間幾乎沒有區別。但對於非POD類型,可用的存儲和對象是完全不同的東西。

realloc爲您提供了大部分可用存儲空間。它操縱存儲不是對象。這對於POD類型可能工作得很好,但對於其他類型而言,這是一種災難處方。

+0

從技術上講,只有在已經通過malloc()分配了內存的情況下,纔有可能使用'calloc()'分配的realloc()或者''realloc()'來擴展數組。 – 2012-03-06 15:35:36

+0

@amalantony哦,'calloc'也一樣。問題在於'realloc'本身。它不關心對象,只關心存儲。 – 2012-03-06 15:37:21

+0

@amal:'malloc'和'calloc'之間的區別與Martinho在這裏所說的完全無關。你不能'重新分配'non-POD對象,因爲你不能將它們逐字節複製,這就是所有'realloc'被定義的。即使在C語言中,如果你的對象包含指向它們自己或彼此的指針,那麼你就不能「重新分配」它們,因爲地址不再正確。 C++只是增加了對非POD類的警告,實現可能會自動插入類似的東西。 – 2012-03-06 15:37:29