簡體   English   中英

內存位置的未處理異常bad_alloc

[英]Unhandled exception bad_alloc at memory location

在c ++中,在分配內存時會發生bad_alloc,或者至少這是我所理解的,但現在我從數組中讀取內存時出現此錯誤。 我創建了數組:

int * possible = new int[ suma ];

然后我有兩個循環,我訪問整個數組:

for( int i = 0; i < n - 1; i++ ){
    int rowWidth = (i - 1) < 0 ? 0 : permutationsNumber[i];
    for( int j = 0; j < permutationsNumber[i]; j++ ){
        possible[i * rowWidth + j ] = j;
    }
}

for( int i = 0; i < n - 1; i++ ){
    int rowWidth = (i - 1) < 0 ? 0 : permutationsNumber[i];
    for( int j = 0; j < permutationsNumber[i]; j++ ){
        std::cout << possible[i * rowWidth + j ] << "\n";
}

在第二行for std::cout << possible[i * rowWidth + j ] << "\\n"; 是我得到錯誤的地方。

我在Windows上編譯代碼,嘗試使用3個不同的機器與Windows 8和7,使用VS 2010,2012和2013並得到相同的錯誤。

當我在Mac上編譯代碼時,沒有錯誤,使用compileonline也是如此

我認為不重要的變量值是:

n = 4;
permutationsNumber = {4, 12, 24};
suma = 40;

您對bad_alloc理解有點不正確。 當new運算符無法分配所請求的內存量時,將拋出bad_alloc 如果你向new發送非常大的值,這種情況發生的情況並不少見。

例如,如果不初始化suma ,則可能發生這種情況。

您應該在調試器中打開第一次異常處理(在gdb中catch throw )並驗證拋出異常的位置以及程序請求的內存量。

您可能正在觀察的是無效的內存引用。 您可以替換您的代碼以使用std::vector並使用at()方法來訪問元素。 如果您錯誤地訪問了超出范圍的元素,這將引發異常。

或者,添加一個這樣的斷言:

#include<cassert>
...
const int idx = i * rowWidth + j;
assert(idx >= 0);
assert(idx < suma);
possible[idx] = j;

如果斷言觸發(可能會),您現在已經確認您的數組太小或索引無效。

你破壞了你的程序堆。 第一對for循環的最后一次傳遞將寫入possible[71] ,但它實際上只有40個插槽。

它不一定立即崩潰的原因是內存保護通常在整個頁面上運行(x86上為4KB)。 除非你的緩沖區恰好落在頁面末尾,否則很可能是數組末尾的許多位置都會落在與數組末尾相同(有效)的頁面上,因此寫入它們可能不會立即導致錯誤。

在Windows上,您可以使用gflags實用程序強制所有堆分配在頁面末尾結束,以便溢出將導致立即頁面錯誤。

暫無
暫無

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

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