[英]dynamic memory allocation c++
我有以下動態分配的數組
int capacity = 0;
int *myarr = new int [capacity];
如果我做這樣的事情會發生什么:
for (int i = 0; i < 5; ++i)
myarr[++capacity] = 1;
如果for
循環執行了5次以上,是否會導致錯誤? 它適用於少量數字,但我想知道這是否是錯誤的方法。
它將導致超出范圍的訪問。 這只是未定義的行為。 您的程序可能崩潰,您的汽車可能無法在早上啟動,您在這里看到了這種模式。
在您的情況下,它恰好可以正常工作,因為通常OS分配的空間超出您的要求,通常為2的倍數,因此在這里,它可能至少分配為8 / 16..256字節。 但是您不應該依賴這種行為。
編輯汽車問題(幾乎)是個玩笑,但是未定義的行為確實意味着未定義。 C ++標准決定不對許多此類問題強制執行編譯器檢查,因為檢查需要時間。 因此,它將行為聲明為未定義行為(UB)。 在這種情況下,絕對不能保證。 如果您在例如控制飛機舵的小型嵌入式系統上工作,那么您可以猜測會發生什么。
這種方法在c ++中是錯誤的。 用new分配內存為您可以訪問而不會在運行時錯誤中運行的新“容量”對象分配內存。 這是在c ++中管理原始數組的更好方法:
int capacity = 10;
int *myarr = new int [capacity];
for (int i = 0; i < 20 ; ++i) {
if (capacity < i) {
// allocate more memory and copy the old data
int *old_data = myarr;
myarr = new int [capacity * 2]
for (int j = 0; j < capacity; ++j) {
myarr[j] = old_data[j];
capacity *= 2;
}
delete [] old_data;
}
myarr[i] = 1;
}
最后總是最好調用delete []
。 在c ++中使用預制動態數組的另一種方法是使用std:array
(在c ++ 11中受支持)或std::vector
(或舊版支持以及我自己的首選選項)庫,它們會自動重新分配更多的內存。 多為矢量和陣列和實例在這里為矢量這里和這里為標准::陣列。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.