2016-03-25 3 views
1

Je reçois erreur de "Double gratuit ou corruption (out)" après que j'imprime ma sortie. Mais cette erreur ne vient que pour les petites entrées. Pour les grandes entrées, le programme ne lance pas cette erreur. Lorsque je crée les tableaux multidimensionnels à l'intérieur du principal et les supprime, je ne reçois pas l'erreur. J'ai seulement posté la partie du code qui est pertinente à cette question ici. S'il vous plaît veuillez expliquer comment résoudre le problème.C++ double gratuit ou corruption (out) erreur

#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

'pour (int i = 1; i <= noItems; i ++)', est en train de sortir de la plage de tableau. – songyuanyao

+0

vous dites dans le destructeur? – jstandshigh

+2

Oui, et dans 'getInputs()'. Pour 'weightArray = new int [noItems];', vous devriez l'itérer par 'for (int i = 0; i songyuanyao

Répondre

1

je crois que la racine de votre problème est dû à la répartition des valueArray, et le fait que vous itérez hors limites.

La ligne valueArray=new int[value]; initialise valueArray avec un tableau de taille value qui est une variable non initialisée. Peut-être que vous vouliez utiliser noItems?

En outre, comme songyuanyao a souligné dans les commentaires, vos boucles for ressemblent for(int i=1;i<=noItems;i++) qui démarre le compteur à 1 et se termine par le compteur à noItems, qui est erronée. Dans de nombreuses langues, C++ inclus, les tableaux commencent à l'index 0 (le premier élément est array[0], et non array[1]) et le dernier élément est un moins la taille du tableau (donc le dernier élément d'un tableau avec 5 éléments est array[4]).

Si vous changez votre boucle for pour commencer à 0 et terminer un élément avant noItems vous devriez être en or. Ce serait for(int i = 0; i < noItems; i++)

Qu'est-ce qui se passe probablement avec des allocations plus petites sont les différents blocs de mémoire sont disposés séquentiellement dans la même zone du segment de mémoire, de sorte que lorsque vous dépassent le tampon avec les données, vous écraser les données de la comptabilité de » new . Lorsque vous avez des allocations plus importantes, la nouvelle mémoire ne peut pas entrer aussi proprement dans l'espace libre du tas, donc l'allocateur finit par laisser un peu d'espace entre les allocations. Ainsi, un petit dépassement ne détruit pas les informations de tas.

+0

vous avez raison. J'ai posté que valueArray = new int [valeur] faux. Mais changer pour noItems n'aide pas non plus. Lorsque je supprime la suppression de la matrice 2d dans le destructeur, l'erreur ne vient pas, mais cela fuit la mémoire – jstandshigh

+0

Ah, j'ai négligé l'autre problème. J'ai mis à jour ma réponse pour refléter la solution posée par songyuanyao, bien qu'il aurait dû l'afficher comme réponse ... – Kaslai