*** glibc détecté *** ./un.: double gratuit ou la corruption (out): 0xbfe69600 ***
Je suis en train de faire un programme pour représenter un tableau des "Étudiants". Il a l'attribut 'ID', 'prénom' et 'Nom'. J'ai fait un tableau à deux dimensions et de mettre le cout des déclarations tout au long de vérifier... La bonne info EST stockée dans la cellule appropriée, mais j'obtiens une erreur que je ne reconnais pas.
le code pour le .fichier cpp est:
#include "Table1.h"
#include <sstream>
#include <iostream>
using namespace std;
Table1::Table1(){
RowPos = 1;
ColPos = 0;
for(int i=1; i<16; i++)
{
for(int j=0; j<3 ; j++)
Students[i][j] = "FakeNull"; //fill the array with Null value
}
}
string Table1::InsertStudent(string ID, string FN, string LN){
Students[0][0] = "StudentID";
Students[0][1] = "FirstName";
Students[0][2] = "LastName";
Students[RowPos][ColPos] = ID; //Assign ID to first column
ColPos++; //Move to next column
Students[RowPos][ColPos] = FN;
ColPos++;
Students[RowPos][ColPos] = LN;
ColPos++;
ColPos = 0;
RowPos++;
}
void Table1::Print(string Name){
if(Name == "students"){
for(int i=1; i<16; i++)
{
int j=0;
if(Students[i][j] == "FakeNull")
break;
else
cout<< "("<< Students[i][j]<< ",";
j++;
cout<< Students[i][j]<< ",";
j++;
cout<< Students[i][j]<< ")";
}
}
}
Ma Table1.h est:
#include <iostream>
using namespace std;
#include <string>
#ifndef GRADE_HEADER
#define GRADE_HEADER
class Table1
private:
string Students[16][3];
string Grades[16][3];
int RowPos;
int ColPos;
public:
Table1();
string InsertStudent(string, string, string);
string InsertGrade(string, string, string, string);
void Print(string);
void Select(string, string, int);
void Select(string, string, string);
void Select(string, string, char);
void Join();
string Converter(int);
};
#endif
L'ERREUR est la suivante:
*** glibc detected *** ./a.out: double free or corruption (out): 0xbfbdeae0 ***
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(+0x75ee2)[0xeadee2]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZdlPv+0x1f)[0x9a951f]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZNSs4_Rep10_M_destroyERKSaIcE+0x1b) [0x99099b]
/usr/lib/i386-linux-gnu/libstdc++.so.6(+0x909dc)[0x9909dc]
/usr/lib/i386-linux-gnu/libstdc++.so.6(_ZNSsD1Ev+0x2e)[0x990a4e]
./a.out[0x8049299]
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xf3)[0xe514d3]
./a.out[0x8048a71]
======= Memory map: ========
003a0000-003ca000 r-xp 00000000 08:01 150255 /lib/i386-linux-gnu/libm-2.15.so
003ca000-003cb000 r--p 00029000 08:01 150255 /lib/i386-linux-gnu/libm-2.15.so
003cb000-003cc000 rw-p 0002a000 08:01 150255 /lib/i386-linux-gnu/libm-2.15.so
005a5000-005a6000 r-xp 00000000 00:00 0 [vdso]
007c5000-007e5000 r-xp 00000000 08:01 150250 /lib/i386-linux-gnu/ld-2.15.so
007e5000-007e6000 r--p 0001f000 08:01 150250 /lib/i386-linux-gnu/ld-2.15.so
007e6000-007e7000 rw-p 00020000 08:01 150250 /lib/i386-linux-gnu/ld-2.15.so
00900000-009d8000 r-xp 00000000 08:01 393409 /usr/lib/i386-linux gnu/libstdc++.so.6.0.16
009d8000-009d9000 ---p 000d8000 08:01 393409 /usr/lib/i386-linux gnu/libstdc++.so.6.0.16
009d9000-009dd000 r--p 000d8000 08:01 393409 /usr/lib/i386-linux gnu/libstdc++.so.6.0.16
009de000-009e5000 rw-p 00000000 00:00 0
00c13000-00c2f000 r-xp 00000000 08:01 132412 /lib/i386-linux-gnu/libgcc_s.so.1
00c2f000-00c30000 r--p 0001b000 08:01 132412 /lib/i386-linux-gnu/libgcc_s.so.1
00c30000-00c31000 rw-p 0001c000 08:01 132412 /lib/i386-linux-gnu/libgcc_s.so.1
00e38000-00fdc000 r-xp 00000000 08:01 150260 /lib/i386-linux-gnu/libc-2.15.so
00fdc000-00fde000 r--p 001a4000 08:01 150260 /lib/i386-linux-gnu/libc-2.15.so
00fde000-00fdf000 rw-p 001a6000 08:01 150260 /lib/i386-linux-gnu/libc-2.15.so
00fdf000-00fe2000 rw-p 00000000 00:00 0
08048000-0804a000 r-xp 00000000 00:19 52698567
0804a000-0804b000 r--p 00001000 00:19 52698567
0804b000-0804c000 rw-p 00002000 00:19 52698567
09df7000-09e18000 rw-p 00000000 00:00 0 [heap]
b77c9000-b77cc000 rw-p 00000000 00:00 0
b77de000-b77e3000 rw-p 00000000 00:00 0
bfbbe000-bfbdf000 rw-p 00000000 00:00 0 [stack]
Aborted (core dumped)
- Veuillez inclure la Table1.h (et nettoyer votre mise en forme) -- pour le moment nous ne pouvons pas voir où vous en êtes l'initialisation de votre Élève de tableau (et si il n'est pas initialisé, vous obtiendrez une erreur comme celle que vous l'obtenir)
- pls fournir la déclaration de la classe
- comment définissez-vous
Students
- La déclaration complète, la définition et le constructeur de détails sont nécessaires afin de faciliter l'orientation. Le
Table1
constructeur ne dispose pas de suffisamment d'informations pour déterminer la façon dont les deux dimensionsStudents
"array" doit être utilisé. Par exemple, estStudents
STL carte contenant de l'entier de la chaîne de paires clé-valeur? - J'ai ajouté de la Table.h section du bas.
- sur une note de côté: je vous suggère fortement de ne JAMAIS mettre un espace de noms à l'aide de dans un en-tête. Vous pouvez avoir de très bonne cause, de ne pas vouloir les conflits avec les choses dans le
std
espace de noms. En outre, je voudrais éviter d'avoir<iostream>
jamais inclus dans un en-tête comme il est massif et va ralentir le temps de compilation. Si et seulement si vous avez besoin d'accéder àistream
etostream
dans un en-tête d'utilisation<iosfwd>
à la place. - Pouvez-vous poster le reste du code, si c'est pas trop long? Les pièces que vous avez montré jusqu'à présent, regardez sur OK. Le
else
clause ::l'Impression d'avoir des accolades ajout de la déclaration de groupe - C++ n'est pas l'utilisation de l'indentation de décider comment les instructions sont regroupées - mais cette erreur ne devrait pas être la cause de la corruption de la mémoire. - Après avoir saisi l'ensemble du code source et de le placer dans une C++ connaissance de l'éditeur, l'accolade ouvrante est manquant pour
class Table1
. Je suis d'accord que les accolades pour le reste de la clause enTable1::Print()
sont manquants. Il est également fortement recommandé d'avoir seulement unusing namespace
directive dans un.cpp
, jamais un en-tête. Il y aura des collisions d'espace de noms et la portée de la résolution de bugs qui seront très difficiles à résoudre si un fichier d'en-tête contient des directives à l'aide. - Le corps principal sera également utile ici. Vous le poster que source de trop? Je dois faire quelques courses, et sera en mesure d'ajouter plus de quelques heures. La réponse ci-dessous devraient vous aider à résoudre les choses et peut-être résoudre le problème.
- voir Modifier les Trois ci-dessous pour les améliorations suggérées pour résoudre le problème. Affichage main.cpp peut-être pas nécessaire, pas plus.
Vous devez vous connecter pour publier un commentaire.
L'erreur signifie simplement que vous avez corrompu tas.
Façons les plus courantes de corruption de segment sont:
Le moyen le plus rapide de découvrir votre bug est d'exécuter le binaire sous Valgrind.
La première chose à faire est de modifier le Tableau 1 constructeur de la sorte:
Il y a trois modifications ci-dessous. Veuillez passer en revue tous de mieux comprendre la situation et les moyens possibles pour le résoudre.
Commencer À Éditer Une
La
Table1::InsertStudent(string ID, string FN, string LN)
ne assurez-vous que RowPos est dans la gamme de0 <= RowPos < 16
. Si le 17ème étudiant est ajouté, puis le code d'accès de la matrice de cellules qui n'existent pas. Par conséquent, une violation d'accès /plantage du programme /un comportement inattendu se produit.Fin D'Éditer Un
Commencer À Éditer Deux
Le codage en dur des valeurs de
16
et3
peut être remplacé par l'utilisateur avec les macros définies à proximité du sommet de la tête, d'avoir une simple modification pour modifier le nombre maximum d'élèves et/ou étudiants détails. Par exemple:Puis plus tard dans l'en-tête et le rpc, les macros sont utilisées dans tous les lieux actuellement en utilisant
16
et3
. Le constructeur de la boucle pourrait alors ressembler à ceci:De Fin D'Éditer Deux
Commencer À Modifier Trois
Après la création d'un unique main.cpp qui ne déclare qu'une instance locale de Table1, les appels Table1::InsertStudent dans un corps de boucle, puis appelle la Table1::Impression, les suggestions suivantes peuvent aider à améliorer et nous espérons résoudre les problèmes. Donc, après l'observation de la sortie imprimée de course ensemble, les modifications de la Table1 constructeur, InsertStudent et d'Impression les fonctions de membres sont les suivantes:
Table1 fichier d'en-tête:
Table1 rpc source (classe de mise en œuvre). Le flux manipulateur
setw
est utilisé pour configurer la sortie de l'écran pour afficher les colonnes. Il est fortement recommandé d'examiner plus de détails ici: std::setw. Également consulter une copie du livre de Stroustrup. Notez que le#include <iomanip>
est absolument nécessaire de définir une largeur de sortie. Les virgules et les parenthèses dans le corps de la méthode d'Impression sont partis. Tout style de présentation est possible, la méthode d'Impression les modifications sont un échantillon, indiquant une façon de le faire. De nombreux autres moyens sont possibles. Notez que cette modification n'a plus aucune valeur fixe chaînes affecté à la position zéro. Toutes les données sur les étudiants commence à l'indice zéro et est valable jusqu'à et y compris laMAX_STUDENTS - 1
position d'index.Cette dernière version devrait résoudre la publication des questions. Nous espérons que les suggestions de favoriser des recherches supplémentaires sur le
iomanip
des aides afin que seules les données sont stockées dans la les Étudiants de tableau. La chaîne de valeur utilisée pour confirmer l'action d'impression (par exemple,"students"
) pourrait également devenir un utilisateur défini macro.Fin D'Éditer Trois