La corruption de segment sur delete[]

J'ai été faire une corruption de segment d'erreur sur delete[] instruction. Le projet est travaillé dans VC++ 2008, son exigence (merci donc de ne pas se concentrer sur cela). Ensemble du processus de renforcement de travail OK, mais au moment de l'exécution j'obtiens l'erreur: (prs_2013 est le nom de mon projet)

Windows a déclenché un point d'arrêt dans prs_2013.exe.

Cela peut être dû à une corruption du tas, ce qui indique un bug dans prs_2013.exe ou une Dll qu'il a chargé.

Cela peut être dû également à l'utilisateur en appuyant sur F12 pendant prs_2013.exe a le focus.

La fenêtre de sortie peut avoir plus d'informations de diagnostic.

Ce code, c'est où l'erreur se produit, c'est juste une fraction de l'ensemble du projet, mais l'erreur est confiné dans ce domaine:

//Function used for swapping row of matrix with new values 
void Main::swap(double* matrix, double* row, unsigned index, unsigned size){
double temp = 0;
for(unsigned i = 0; i < size; i++){
temp = matrix[i*size + index];
matrix[i*size + index] = row[i];
row[i] = temp;
}
}
//Function that do some calculations, not really relevant for this problem
//but still used in code
double Main::determinat(double* matrix, unsigned size){
double ud = 0, du = 0;
for(unsigned  j = 0; j < size; j++){
double ude = 1, due = 1;
for(unsigned  i = 0; i < size; i++){
ude *= matrix[i*size + (i+j)%size];
due *= matrix[(size-i)*size + (i + j)%size];
}
ud += ude;
du += due;
}
return ud - du;
}
//Function in which error occurs 
double* Main::get_x(double* matrix, unsigned size){
//error checking
if(size == 1){return NULL;}
double *x = new double[size];  
x[0] = 1;
unsigned const temp_size = size-1;
double *temp = new double[temp_size * temp_size];   //temporary matrica    
double *x0_coef = new double[temp_size]; //variable on which error occures
for(unsigned i = 0; i < temp_size; i++)
x0_coef[i] = matrix[i*size + 0] / s[0];     //s is class member, init in constructor s[0] != 0
for(unsigned i = 1; i < size; i++)
for(unsigned j = 1; j < size; j++)
if(i == j)
temp[(i-1)*size + j-1] = (matrix[i*size + j] - 1) / s[i];
else
temp[(i-1)*size + j-1] =  matrix[i*size + j] / s[i];
double deltaS = determinat(temp, temp_size);        //delta of system
for(unsigned i = 0; i < temp_size; i++){    //delta of vars
swap(temp, x0_coef, i, temp_size);
x[i+1] = determinat(temp, temp_size) / deltaS;
swap(temp, x0_coef, i, temp_size);
}
delete[] x0_coef;  //place where error occures
delete[] temp;
return x;
}

Mais la même chose se produit-il si je change delete[] x0_coef; avec delete[] temp;, une erreur se produit sur temp;

Comme vous pouvez le voir dans le code, je ne suis pas à l'aide de char, c'est à dire. décisions de la Chaîne ainsi, l'ajout de '\0' est inutile parce que 0 est toujours valide.

Mais maintenant la partie intéressante, j'ai testé la fonction d'échange avec ce code:

#include <iostream>
using namespace std;
void swap(double* a, double* b, unsigned size){
double temp = 0;
for(unsigned i=0; i < size; i++){
temp = a[i];
a[i] = b[i];
b[i] = temp;
}
}
void main(){
double *a = new double[5],
*b = new double[5];
for(unsigned i=0; i < 5; i++){
a[i] = i;
b[i] = i*i;
}
swap(a, b, 5);
for(unsigned i=0; i < 5; i++)
std::cout << "a: " << a[i] << " b: " << b[i] << endl;
delete[] a;
delete[] b;
system("PAUSE");
}

Et tout a fonctionné.

Pour être honnête, je suis à la fin de mes esprits, je viens de passer 2-3 jours à essayer de trouver ce que c'est que je suis absent. Mais la plupart des autres rubriques sont liées à la prise de char array, String, et en général miss calcul des matrices de longueur. Et comme il est indiqué dans le code, je porte toujours des tableaux de longueur à d'autres fonctions.

Je suis sûr qu'il ya de meilleurs codes pour faire ce que j'ai à faire, mais c'est en solo-requis du projet donc je ne suis pas à la recherche dans de meilleures fonctionnalités pour m'aider à voir ce que je fais de mal avec les tableaux.

C'est le genre de choses qui peuvent se produire lorsque vous effectuez manuel de gestion de la mémoire avec des pointeurs, new, et delete (ou leur tableau homologues). Je conseille RAII wrappers comme std::vector à la place. Boost a aussi des classes pour les multi-dimensions des tableaux
C'est le genre de choses qui arrivent quand on a une mauvaise gestion de la mémoire avec des pointeurs.
Je sais que je pourrais utilisé déjà fait des libs, mais qui est hors de l'exigence de ce projet. À l'exception de <iostream>, <fiosteam>, <cstring> et <cmath> je ne peux pas utiliser n'importe quel autre lib. J'ai vraiment cant vous montrer mais j'ai même mis en place des listes chaînées et rond-tampon. Et ce genre de chose se produire lorsque j'essaie de faire tout le projet en 2 jours sans dormir.

OriginalL'auteur Igor | 2013-06-08