2016-08-02 17 views
1

Ich bin für einen Vektor von Vektoren Reserveraum versucht, aber es funktioniert nicht und führt den folgenden Fehler:Allokierung von Speicher für einen Vektor von Vektoren

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

Jedes Mal, wenn ich eine ausreichend große Zahl verwenden . Eine minimale Version von dem, was ich habe, ist unten:

#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; 
} 

Es sollte für große structSizes arbeiten, aber nicht an der Basis = 3, Maß = 4, Länge = 6, die structSize = 324.540.216 macht. Kann das funktionieren?

+2

Ja, es ist möglich - fügen Sie mehr Speicher zu Ihrem PC hinzu – Slava

+2

Haben Sie die Berechnung durchgeführt, wie viel Speicher das erfordern würde? –

+0

Speichern Sie wirklich jedes Ergebnis? Können Sie nicht einfach über das Ergebnis iterieren? – Jarod42

Antwort

5

Sie müssen über Ihren Speicherverbrauch nachdenken.

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?

Also, was Sie tun, auf einer abstrakten Ebene, ist eine Datenstruktur, die die Zuweisung 324,540,216 Instanzen eines vector<vector<double>> Objekt enthält.

Hier ist, was wir wissen, über vector Objekte:

  • Seine Größe mindestens 16 Byte sein muss; es muss einen Zeiger speichern, der in einer 64-Bit-Architektur wahrscheinlich 8 Bytes groß ist, und er muss eine Größe speichern, die wahrscheinlich auch 8 Bytes beträgt.
  • Ihre Größe wird wahrscheinlich wesentlich größer sein, da Sie in dem Moment, in dem Sie das letzte vector<double> Objekt instanziieren, jedes Mal, wenn Sie eines erstellen, ein weiteres [mindestens] 16 Byte verbrauchen.

Also nur auf den ersten Blick, Ihre allStructs.reserve(structSize) Anruf Zuteilung 5 Gigabyte. Es wird wahrscheinlich mehr als das zugewiesen, da die Größe der Metadaten eines Vektors durchaus größer als 16 Byte sein kann.

+0

Technisch gibt es keine Begrenzung für die Größe eines Vektors, wenn alles, was er speichert, ein Index in ein Vektor-Array an anderer Stelle ist. Sogar auf der realistischeren Seite sah ich eine Implementierung von 'std :: string' einmal, wo der interne Zeiger auf die Daten zeigte und die Größe und Kapazität bei mData [-4] und mData [-8] speicherte, was das bedeutete 'printf ("% s ", myStdString)' würde tatsächlich funktionieren. –

+0

@MooingDuck Fair-Point, obwohl es immer noch Probleme bei der Speicherreservierung verursachen würde, sobald der Benutzer versuchte, Werte in jedem dieser Indizes zu speichern und mit diesen zu arbeiten. – Xirema

2

Deklarieren Sie Ihre StructSize als double StructSize = 1.0; dann sollte es "logisch" funktionieren.

Allerdings funktioniert reserve() möglicherweise nicht aufgrund möglicher Speicherbeschränkungen auf Ihrem PC.

Verwandte Themen