簡體   English   中英

使用較小內存量時,C ++ std :: bad_alloc錯誤?

[英]C++ std::bad_alloc error when using smaller amount of memory?

我做了一個函數,可以存儲所有秘密數字的解,然后將其用於算法中。

此功能對某些輸入值有效。 但是,對於某些情況它不起作用。 問題是我遇到與使用過多內存有關的錯誤,考慮到以下問題,這是沒有道理的:

生成多少個數字的限制是:

int possibilities = std::pow(symbols, length);

當您這樣做時:

generate_list( list , 6, 4 ); it generates 4^6 different numbers = 4096

但是,當您這樣做時:

 generate_list( list , 4, 6 ); it does not generates 6^4 numbers = 1296 due to error

當生成較少的數字時,如何給出一個不足的內存錯誤?

錯誤是:

    terminate called after throwing an instance of 'std::bad_alloc'
     what():  std::bad_alloc

它與內存分配本身沒有任何關系。

問題在於這些線

        int zerosneeded = length - tmp.size();

        while (zerosneeded != 0) {
            tmp.push_back(0);
            zerosneeded--;
        }

不知道為什么zerosneeded ,我在查看代碼時遇到的問題是“需要zerosneeded需要小於零嗎?”。 尤其是因為將zerosneeded定義為int而不是unsigned int (適用於其余代碼)。

如果zerosneeded小於零,那么將存在一個無限循環,直到耗盡為止。 快速檢查可以確認:

int zerosneeded = length - tmp.size();
if(zerosneeded < 0)
{
    std::cout << "fatal, zerosneeded < 0 \n";
    throw std::runtime_exception("fatal, zerosneeded < 0");
}

希望這對您的調試有所幫助。

編輯

至於為什么需要零為負:

首先,計算可能性的數量,即符號長度。

int possibilities = std::pow(symbols, length);

當將值推入tmp時,我們基本上找到第一個x,即length ^ x>商。 該商在[0,symbols ^ length]范圍內,用於將值壓入tmp。

int quotient = i;
while (quotient!=0) {
    tmp.push_back(quotient % length);
    quotient = quotient / length;
}

如果symbol ^ length> length ^ length,則第一個x,使length ^ x>商產生x> length,從而使int zerosneeded = length - tmp.size(); 變得消極。

對於示例,我們的長度= 4,符號= 6,因此商的范圍為[0,6 ^ 4] = [0,1296]。 但是對於256,已經有4 ^ 4 = 256 => 4 ^ 5> 256,因此我們的x = 5 => zerosneeded = 4-5 = -1。

對於length = 4和symbol = 6來說,這沒什么特別的,只要length <symbol,實際上就應該發生。

暫無
暫無

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

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