簡體   English   中英

c ++取消分配2d int數組錯誤

[英]c++ deallocate 2d int array error

在下面的代碼段中,我得到非常令人沮喪的錯誤。 多數民眾贊成在我的數組。

int **tab2 = new int*[3];

我像這樣分配。

for(i = 0; i < 10; i++) {
    tab2[i] = new int[3];
    tab2[i][0] = 40;
    tab2[i][1] = 10;
    tab2[i][2] = 100;
}

然后,在使用它之后,我想銷毀它。

for(i = 0; i < 10; i++) {
    delete [] tab2[i];
}
delete [] tab2;

這會導致核心轉儲每一次。 我嘗試了許多不同的方法來銷毀它,每次都收到此錯誤。 我在這里弄錯了什么?

這個

int **tab2 = new int*[3];

不按照您的想法去做。

您需要一個包含十個(10)指針的數組,每個指針指向三個整數的數組。

new int*[3]是一個包含三個指針的數組。

您想要的是這個(住在coliru)

#include <iostream>

int main() {

  int **tab2 = new int*[10];

  for(int i = 0; i < 10; i++) {
    tab2[i] = new int[3];
    tab2[i][0] = 40;
    tab2[i][1] = 10;
    tab2[i][2] = 100;
  }

  for(int i = 0; i < 10; i++) {
    delete [] tab2[i];
  }
  delete [] tab2;

}

int **tab2 = new int*[3];

您分配了一個大小為3的指針數組。

for(i = 0; i < 10; i++) {
    tab2[i] = new int[3];
    //...
}

您最多可以訪問索引9 那肯定會出錯。 刪除過程對我來說很好。 要修復它,您應該分配一個大小為10而不是3的指針數組,例如

int **tab2 = new int*[10];

看起來您想要做的是創建一個N by M數組,其中N在運行時是已知的,M是固定的(在本例中為3)。

為什么不這樣做呢?

{
    std::array<int, 3> defaults = {{ 40, 10, 100 }};
    std::vector<std::array<int, 3>> thing(10, defaults);
}

向量超出范圍時, thing會自動釋放,它的大小可以在運行時設置。 您仍然可以通過相同的方式訪問結構:

thing[1][2] = 3

使用標准容器和智能指針可以輕松避免手動進行內存管理。 這樣做將使您的代碼更整潔,並減少了懸空指針和內存泄漏的機會。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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