2016-08-02 57 views
1

我想保留空間向量的向量的載體,但它不工作,並拋出以下錯誤:分配內存爲載體

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

每次我用一個足夠大的數。的我有一個最小的版本下面是:

#include <vector> 
#include <iostream> 
using namespace std; 


int main(){ 

    int base; 
    cout << "Enter Base: "; 
    cin >> base; 

    int dimension; 
    cout << "Enter Dimension: "; 
    cin >> dimension; 

    int perms = 1; 
    for(int i=0; i<dimension; i++){ 
    perms *= base; 
    } // This gets the number of permutations with repetition 

    int length; 
    cout << "Enter Length: "; 
    cin >> length; 

    float structSize = 1.0; 

    for(float i=0.0; i<length; i++){ 
    structSize *= perms-i; 
    structSize /= (i+1.0); 
    } // This gets the number of combinations 

    vector< vector< vector<double> > > allStructs; 
    allStructs.reserve(structSize); 

    return 0; 
} 

應該爲大structSizes工作,但在基部= 3,尺寸= 4,長度= 6這使得structSize = 324540216失敗。這有可能工作嗎?

+2

是的,這是可能的 - 增加更多的內存到你的電腦 – Slava

+2

你有沒有做這個數字需要多少內存? –

+0

你真的要存儲每個結果嗎?你不能只是迭代結果嗎? – Jarod42

回答

5

你需要考慮你的記憶使用。

It should work for large structSizes, but fails at base=3, dimension=4, length=6 which makes structSize=324,540,216. Is it possible for this to work?

所以,你在做什麼,在抽象的層面,被分配一個包含vector<vector<double>>對象的324,540,216實例的數據結構。

下面是我們所知道的vector對象:

  • 它的大小必須至少爲16個字節;它需要存儲一個指針,該指針在64位體系結構中可能是8個字節,並且需要存儲一個大小,該大小也可能是8個字節。
  • 它的大小可能會大得多,因爲從實例化最後一個對象的那一刻起,每次創建對象時都會消耗另一個[at-least-] 16個字節。

所以就在它的表面上,您的allStructs.reserve(structSize)調用分配了5千兆字節。它可能會分配更多,因爲矢量元數據的大小可能會大於16個字節。

+0

從技術上講,如果矢量的大小都是向量數組的索引,則矢量的大小沒有限制。即使在更現實的一面,我看到一次內部指針指向數據的'std :: string'的實現,並將大小和容量存儲在mData [-4]和mData [-8]中,這意味着'printf(「%s」,myStdString)'實際上可以工作。 –

+0

@MooingDuck公平點,儘管在用戶試圖實際存儲和處理每個索引中的值時,它仍會導致內存分配問題。 – Xirema

2

聲明你的StructSize爲double StructSize = 1.0;那麼它應該「邏輯」的工作。

但是,reserve()可能無法正常工作,因爲您的PC可能會受到內存限制。