2
A
回答
9
您不能展開這種類型的動態存儲器陣列。你可以使用malloc
和realloc
,雖然如果你需要這個設施,但我會建議反對,並建議包括<vector>
和使用std::vector
來代替。它有一個resize
方法。
此外,你所描述的不會編譯。以下將:
1: int *a = new int[5];
2: a = new int[2];
上面將分配兩個內存塊,這兩個內存塊都不會被銷燬。第二行將簡單地將一個新的數組分配給相同的int *a
指針。當分配的內存停止被任何指針引用時,這稱爲內存泄漏。上面的代碼丟失了對new int[5]
的任何引用,並且無法將此內存釋放到操作系統。
雖然這不是一個非常實用的例子,但有多種方法可以調整數組/矢量的大小。 因爲它通常是實際增加數組的大小,我將這樣做的:
{ // C++ vector on the stack (although internally vector uses memory from the heap)
std::vector<int> a(1024);
// do smth
a.resize(4096); // note: this does not always reallocate
// do smth else
}
{ // C++ everything on the heap
std::vector<int> *a = new std::vector<int>(1024);
// do smth
a->resize(4096); // note: this does not always reallocate
// do smth else
delete a;
}
{ // C style
int *a = (int*)malloc(1024*sizeof(int));
// do smth
a = realloc(a, 4096*sizeof(int));
// do smth else
free(a);
}
這是值得大家注意的是realloc
不會做任何事情聰明。它所做的就是:
- 分配新的內存塊
malloc
- 從舊的內存塊將數據複製到新的內存塊
memcpy
- 免費舊的內存塊
free
- 返回新內存塊
1
你可以當然擴大數組,但你需要照顧複製的內容和免費舊數組(你的代碼,除了不正確的語法,收縮數組,順便說一句)。
究竟如何std::vector
工作,只是你不必在意。
因此,基本上,在已經分配int *a
,需要採取什麼是一樣的東西:
{
std::unique_ptr<int[]> d(a);
a = new int[desired_new_size];
for(unsigned int i = 0; i < min_old_size_and_new_size; ++i)
a[i] = d[i];
}
注意,嚴格的說「擴」從來沒有真正擴展陣列,但與另一大的一個替換它(對於提供相同功能的任何容器也是如此)。但是這對任何使用指針的代碼都是透明的,沒有人會知道。
你應該從未使用realloc
(或任何其他C內存分配函數),其與如上指出的存儲器分配或通過operator new
和delete
(或new[]
和delete[]
)釋放的組合。
這可能工作(通常會),但它在概念上是錯誤的,如果它沒有崩潰,它是純粹的運氣(未知的實現細節)。
相關問題
- 1. 有沒有辦法在kaminari中使用數組擴展?
- 2. 有沒有辦法在Chrome擴展中使用C++?
- 3. C++:有沒有辦法定義一個靜態數組內聯?
- 4. 在C或C++中,有沒有辦法擴展一個沒有繼承的類?
- 5. 有沒有辦法'擴展'#define指令?
- 6. 有沒有辦法擴展ThreeJS對象?
- 7. 有沒有辦法在c#中動態獲取方法名?
- 8. 鉻擴展 - 有沒有辦法永久保存文件?
- 9. 有沒有什麼辦法知道在javascript中擴展屏幕
- 10. 有沒有辦法在運行中擴展/收縮UITableViewCells?
- 11. 有沒有辦法在woodstox中設置實體擴展限制?
- 12. 有沒有辦法在Excel中調整/擴展過濾列表?
- 13. 有沒有辦法在StackOverflowException中打印任何擴展信息?
- 14. 有沒有辦法在Paperclip中黑名單擴展?
- 15. 有沒有辦法在Chrome擴展中加載一個applet?
- 16. 有沒有什麼辦法在擴展中使用Chrome資源
- 17. 有沒有辦法在java中循環動態創建組件?
- 18. 有沒有辦法手動擴展可變模板?
- 19. 有沒有辦法指定被動擴展observables的初始值?
- 20. 有沒有辦法擴展swig/python中的所有類?
- 21. 有沒有辦法只釋放C/C++中的動態分配數組的一部分(收縮現有數組)?
- 22. 有沒有辦法將參數傳遞給Chrome擴展?
- 23. 有沒有辦法動態走進多維數組?
- 24. 有沒有辦法讓一個數組保存c中的其他數組?
- 25. 有沒有辦法讓一個文本框自動擴展沒有jQuery?
- 26. 有沒有辦法在c#中強制函數內聯?
- 27. 有沒有辦法在Eclipse Project Explorer中自動擴展特定文件夾?
- 28. 有沒有辦法在python中動態創建/修改函數
- 29. 有沒有辦法在一個數組
- 30. 有沒有辦法在一個數組
你會期待/希望這段代碼做什麼? – sth
當然,該代碼是合法的,但它可能不會做你期望的。 – Bwmat
使用'std :: vector'。 –
GManNickG