From: tmurez AT nospam DOT planete DOT net (Thibaut Murez) Newsgroups: comp.os.msdos.djgpp Subject: Class pb appeared with djgpp 2.02 Date: Mon, 21 Dec 1998 14:39:08 +0100 Organization: Planete.net, France Lines: 216 Message-ID: NNTP-Posting-Host: numeris-bdx-1.planete.net X-Newsreader: Anawave Gravity v2.00 To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com Hi i've built a class to use personal resources under DOS.Whereas the code ran fine when compiled using djgpp 2.01, now it generates a GPF at the exit, when i delete my class. Full sources of my class are following (1 header and 1 C++ code file) but are commented in french. At the end of this post youll find an example program and the gpf i get for you to understand my problem. ################################################ #pack.h include //malloc #include //fopen etc #ifndef BYTE #define BYTE unsigned char #endif #ifndef WORD #define WORD unsigned short #endif #ifndef DWORD #define DWORD unsigned long #endif #ifndef PACKED #define PACKED __attribute__ ((packed)) #endif #define PAS_DE_FICHIER 0 //pas de fichier dans l archive #define ERREUR_D_OUVERTURE 1 //Impossible d'ouvrir l archive #define MAUVAIS_FICHIER 2 //archive d'un autre type ou pas d archive #define SUCCES 255 typedef struct { BYTE Signature[8] PACKED; WORD NbFichiers PACKED; } Pack_PreHeader; typedef struct { BYTE NomFichier[13] PACKED; //8.3=12 + caractere nul de fin de chaine DWORD DebutFichier PACKED; DWORD FinFichier PACKED; DWORD LongueurFichier PACKED; } Pack_Header; class PackedFile { public: //////////////////////////////////////////////////////////////////// /////////////////////Variables///////////////////////////////////// ////////////////////////////////////////////////////////////////// Pack_PreHeader PreHeader; Pack_Header *Header; BYTE Succes; WORD NombreFichiers; FILE *FichierPacke; //////////////////////////////////////////////////////////////////// //////////////////Constructeur/Destructeur///////////////////////// ////////////////////////////////////////////////////////////////// PackedFile(char *NomFichier); ~PackedFile(); //////////////////////////////////////////////////////////////////// /////////////////////Fonctions Membres///////////////////////////// ////////////////////////////////////////////////////////////////// WORD RetournePositionFichier(BYTE *NomFichierDOS); DWORD ExtraitFichier(WORD PositionFichier); void RefermeFichier(BYTE *FichierExtrait); }; ######################################################################## #pack.cc #include "pack.h" PackedFile::PackedFile(char *NomFichier) { if((FichierPacke=fopen(NomFichier, "rb"))!=NULL) { fseek(FichierPacke, -(sizeof(PreHeader)), SEEK_END); fread(&PreHeader, sizeof(PreHeader), 1, FichierPacke); if(PreHeader.Signature[0]!='T' || PreHeader.Signature[1]!='h' || PreHeader.Signature[2]!='i' || PreHeader.Signature[3]!='b' || PreHeader.Signature[4]!='a' || PreHeader.Signature[5]!='u' || PreHeader.Signature[6]!='t' || PreHeader.Signature[7]!='\0') Succes=MAUVAIS_FICHIER; else { if((NombreFichiers=PreHeader.NbFichiers)==0) Succes=PAS_DE_FICHIER; else { fseek(FichierPacke, - (sizeof(PreHeader)+(sizeof(Pack_Header)*NombreFichiers)), SEEK_END); Header=(Pack_Header *)malloc(NombreFichiers); fread(Header, sizeof(Pack_Header)*NombreFichiers, 1, FichierPacke); Succes=SUCCES; } } } else Succes=ERREUR_D_OUVERTURE; } PackedFile::~PackedFile() { if(Succes==SUCCES) free(Header); fclose(FichierPacke); } WORD PackedFile::RetournePositionFichier(BYTE *NomFichierDOS) { WORD Retour=0xffff, Position; BYTE Trouve; for(Position=0;PositionSucces==SUCCES) { int position=Data->RetournePositionFichier((BYTE *)"test1.pcx"); Buffer=(BYTE *)Data->ExtraitFichier(position); //Décompression de l'image Data->RefermeFichier(Buffer); //Affichage de l'image, retour en mode texte delete Data; } else //Affichage msg d erreur } ######################################################################### #GPF General Protection Fault at eip=00005217 eax=0d31e000 ebx=0009616c ecx=0009617c edx=0d333acc esi=0009617c edi=034c7800 ebp=00095b5c esp=00095b50 program=C:\PROGRA~1\PROGRA~1\SOURCES\DJGPP\PACKER\PACK .EXE cs: sel=00a7 base=829cd000 limit=000dffff ds: sel=00af base=829cd000 limit=000dffff es: sel=00af base=829cd000 limit=000dffff fs: sel=0087 base=00018df0 limit=0000ffff gs: sel=00bf base=00000000 limit=0010ffff ss: sel=00af base=829cd000 limit=000dffff App stack: [00095bc0..00015bc0] Exceptn stack: [00015aa4..00013b64] Call frame traceback EIPs: 0x00005217 _free+247 0x0000168e __$_10PackedFile+22, line 35 of pack.cc -->free(Header) [destructor] 0x00001c19 _main+741, line 61 of test.cc ->delete Data; 0x0000471a ___crt1_startup+174 Thanks in advance