2016-03-25 11 views
1

Ich bekomme Fehler von "Double frei oder Korruption (out)", nachdem ich meine Ausgabe drucke. Dieser Fehler tritt jedoch nur bei kleinen Eingaben auf. Bei größeren Eingaben wirft das Programm diesen Fehler nicht. Wenn ich die mehrdimensionalen Arrays im Hauptverzeichnis erstelle und lösche, erhalte ich den Fehler nicht. Ich habe hier nur den Teil des Codes veröffentlicht, der für dieses Problem relevant ist. Bitte erläutern Sie, wie Sie das Problem beheben können.C++ doppelt frei oder Korruption (out) Fehler

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

class Knapsack{ 
    public: 
    int noItems, capacity, value, weight; 
    int *weightArray, *valueArray; 
    int **ValueMatrix, **BacktrackMatrix; 
    vector<int> itemsChosen; 
    ~Knapsack(); 
    void getInputs();    // reads in data 
    void findItems();   // calculates best value of items 
    void backTrack(int row, int col); // backtracks items selected 
    void print();      //prints out data 
}; 

Knapsack::~Knapsack() 
{ 
    delete[] weightArray; 
    delete[] valueArray; 
    for(int i=1;i<=noItems;i++) 
    { 
    delete[] ValueMatrix[i]; 
    } 
    delete[] ValueMatrix; 
    for(int i=1;i<=noItems;i++) 
    { 
    delete[] BacktrackMatrix[i]; 
    } 
    delete[] BacktrackMatrix; 
} 

void Knapsack::getInputs() 
{ 
    cin>>noItems; 
    cin>>capacity; 
    weightArray=new int[noItems]; 
    valueArray=new int[value]; 
    for(int i=1;i<=noItems;i++) 
    { 
    cin>>value; 
    valueArray[i]=value; 
    } 
    for(int i=1;i<=noItems;i++) 
    { 
    cin>>weight; 
    weightArray[i]=weight; 
    } 
    ValueMatrix=new int*[noItems]; 
    for(int i=1;i<=noItems;i++) 
    { 
    ValueMatrix[i]=new int[capacity+1]; 
    } 
    BacktrackMatrix=new int*[noItems]; 
    for(int i=1;i<=noItems;i++) 
    { 
    BacktrackMatrix[i]=new int[capacity+1]; 
    } 
} 

int main() 
{ 
    Knapsack *knap=new Knapsack(); 
    knap->getInputs(); 
    knap->findItems(); 
    knap->print(); 
    delete knap; 
    return 0; 
} 
+1

'für (int i = 1; i <= noItems; i ++)', verlässt den Array-Bereich. – songyuanyao

+0

Sie sagen im Destruktor? – jstandshigh

+2

Ja, und in 'getInputs()'. Für 'weightArray = new int [noItems];' sollten Sie es mit 'for (int i = 0; i songyuanyao

Antwort

1

Ich glaube, die Wurzel Ihrer Ausgabe durch die Zuweisung von valueArray verursacht wird, und die Tatsache, dass man außerhalb der Grenzen iterieren. Die Zeile valueArray=new int[value]; initialisiert valueArray mit einem Array der Größe value, das eine nicht initialisierte Variable ist. Vielleicht wollten Sie noItems verwenden?

Auch als songyuanyao in den Kommentaren darauf hingewiesen, Ihre for Schleifen aussehen for(int i=1;i<=noItems;i++), die den Zähler bei 1 beginnt und endet mit dem Zähler bei noItems, die fehlerhaft ist. In vielen Sprachen, einschließlich C++, beginnen Arrays mit dem Index 0 (was bedeutet, dass das erste Element array[0], nicht array[1] ist) und das letzte Element eins minus der Größe des Arrays ist (also das letzte Element eines Arrays mit 5 Elementen ist array[4])).

Wenn Sie Ihre for Schleife ändern, um bei 0 zu beginnen und ein Element vor noItems zu beenden, sollten Sie golden sein. Das wäre for(int i = 0; i < noItems; i++)

Was wahrscheinlich ist mit kleineren Zuweisungen geschieht die verschiedenen Speicherblöcke sequentiell in dem gleichen Bereich des Heap-Speicher angeordnet sind, so dass, wenn Sie den Puffer mit Daten überlaufen, sind Sie new ‚s Buchhaltungsdaten Zerschlagung .

Wenn Sie größere Zuordnungen haben, kann der neue Speicher nicht so sauber in den freien Speicherbereich des Heapspeichers passen, so dass der Zuordner schließlich zwischen den Zuweisungen einen gewissen Spielraum lässt. Ein kleiner Überlauf zerstört daher die Heap-Informationen nicht.

+0

Sie haben Recht. Ich postete das valueArray = new int [value] falsch. Aber der Wechsel zu noItems hilft auch nicht. Wenn ich das Löschen der beiden 2d-Array in Destruktor entfernen, kommt der Fehler nicht, aber das Speicher – jstandshigh

+0

Ah, ich habe das andere Problem übersehen. Ich habe meine Antwort aktualisiert, um die Lösung von songyuanyao widerzuspiegeln, obwohl er sie als Antwort hätte posten sollen ... – Kaslai

Verwandte Themen