簡體   English   中英

動態內存分配C ++

[英]dynamic memory allocation c++

我有以下動態分配的數組

int capacity = 0;
int *myarr = new int [capacity];

如果我做這樣的事情會發生什么:

for (int i = 0; i < 5; ++i) 
myarr[++capacity] = 1;

如果for循環執行了5次以上,是否會導致錯誤? 它適用於少量數字,但我想知道這是否是錯誤的方法。

您正在設置超出數組范圍的內存。 這可能會覆蓋程序另一部分中正在使用的內存,這是未定義的行為。 要解決這個問題,您應該像這樣聲明您的數組:

int * myArray =新的int [5];

這樣就可以做到,因此您不必分配超出數組的范圍。

但是,最好使用std::vector 通過管理內存本身,可以防止發生這種情況。 您可以像這樣向std::vector添加項目:

Vector.push_back(myItem);

您可以這樣聲明一個整型向量:

std::vector<int> Vector;

您可以在此處閱讀更多有關std::vector 信息

它將導致超出范圍的訪問。 這只是未定義的行為。 您的程序可能崩潰,您的汽車可能無法在早上啟動,您在這里看到了這種模式。

在您的情況下,它恰好可以正常工作,因為通常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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM