Accueil > Forum > > > > [C++] Violation d'accès lors de la lecture de l'emplacement 0xfdfdfdfd.
[C++] Violation d'accès lors de la lecture de l'emplacement 0xfdfdfdfd.
lundi 1 mars 2010 à 13:13:23 |
[C++] Violation d'accès lors de la lecture de l'emplacement 0xfdfdfdfd.

3Fred9
|
Bonjour,
J'ai changé de compilateur de Visual C++ 6 à Visual Studio 2005 et depuis j'ai une fonction qui plante à l'exécution par une violation d'accès comme mentionnée dans le titre.
Pour simplifier j'ai une structure définie dans un . h
Code C/C++ :
typedef struct Instance_s {
long Instance;
char *DocName;
char *Header;
Record_s *RecordList;
Record_s *LastRecord;
struct Instance_s *Previous;
struct Instance_s *Next;
char* Collation;
} Instance_s;
Les fonctions sont écrits dans un projet compilés dans une dll.
La première fonction qui est appelée et qui initialise la structure ne pose aucun soucis :
Code C/C++ :
bool ACG_IMPORT WORD97_NewInstance(ObCharFld &RS,
ObLongFld &Instance,
ObCharFld &DocName,
AzCPrint_Collation &Collation)
{
Instance_s *I;
int Len;
//-- Définition de la variable "dn" et affectation avec la chaine "DocName".
char *dn = DocName.GetText();
char *lCollation = Collation.GetText();
//-- Creation d'une entité "I", instance de la classe "Instance_s".
I = new Instance_s;
//-- Remplissage de toute la structure mémoire de "I" avec des zéros.
memset(I, 0, sizeof(I));
//-- Allocation d'une nouvelle zone mémoire à "I->DocName" et recopie
// de la chaine "dn" (Nom du document) dans cette zone mémoire.
Len = strlen(dn) + 1;
I->DocName = new char[Len];
memcpy(I->DocName, dn, Len);
//Collation
Len = strlen(lCollation) + 1;
I->Collation = new char[Len];
memcpy(I->Collation, lCollation, Len);
//-- On attribut à "I" le numéro d'instance de la variable "NextInstance"
// on incrémente "NextInstance" de 1
// puis on affecte ce numéro au paramètre "Instance" passé par référence.
Instance = I->Instance = NextInstance++;
//-- Initialisation de la valeur des attributs de "I".
I->Header = NULL;
I->RecordList = NULL;
I->LastRecord = NULL;
I->Previous = NULL;
if ((I->Next = InstanceList) != NULL)
InstanceList->Previous = I;
//-- On fait pointer la liste des instances "InstanceList" sur l'instance "I".
InstanceList = I;
RS.SetText(" ");
return true;
}
Jusqu'ici les allocations en mémoire se passent bien... là où ça se plante c'est lors de l'appel à une deuxième fonction :
Code C/C++ :
bool ACG_IMPORT WORD97_SetHeader(ObCharFld &RS,
ObLongFld &Instance,
ObCharFld &Header)
{
Instance_s *I;
int Len;
I = FindInstance(Instance);
if (!I) {
MessageBox(NULL, "Instance WORD non trouvee", _TITRE_MSGBOX_ERREUR, MB_OK);
RS.SetText("ERR");
return false;
}
Len = strlen(Header.GetText()) + 1;
I->Header = new char[Len];
memcpy(I->Header, Header.GetText(), Len);
RS.SetText(" ");
return true;
}
et plus précisément lors de la ligne de code :
Code C/C++ : I->Header = new char[Len];
Quelqu'un aurait il une idée ?
D'avance merci.
Fred
|
|
lundi 1 mars 2010 à 21:14:00 |
Re : [C++] Violation d'accès lors de la lecture de l'emplacement 0xfdfdfdfd.

Lucky92
|
Salut,
Je dirais que FindInstance(...) échoue mais ne renvoie pas 0.
Un conseil : il faut toujours initialiser les pointeurs.
Avec "Instance_s *I = 0 ;", je pense que tu vas y voir plus clair.
Cordialement.
|
|
mercredi 3 mars 2010 à 09:23:32 |
Re : [C++] Violation d'accès lors de la lecture de l'emplacement 0xfdfdfdfd.

3Fred9
|
Bonjour,
Tout d'abord merci Lucky92 pour cette première piste...
J'ai donc initialisé le pointeur I à 0 lors de sa déclaration dans la fonction SetHeader et ce avant l'appel à la fonction FindInstance comme tu m'a conseillé, mais celà n'a rien changé  et la fonction FindInstance m'a bien retourné l'adresse du pointeur I crée dans la fonction NewInstance.
Affaire à suivre...
Encore merci.
Fred
|
|
samedi 6 mars 2010 à 14:22:54 |
Re : [C++] Violation d'accès lors de la lecture de l'emplacement 0xfdfdfdfd.

mezaya
|
salut,
0xFDFDFDFD veut dire que tu est en train de lire dans les guards du malloc. à mon avis FindInstance ne retourne pas le type que tu crois.
sinon en regardant vite fait le code:
cette ligne est très bizarre : "memset(I, 0, sizeof(I));" c'est pas plutot "memset(I, 0, sizeof(Instance_s));"
parceque la tu met à 0 que les 4 premiers octet.
Voili,Voilou 
|
|
mardi 9 mars 2010 à 07:50:46 |
Re : [C++] Violation d'accès lors de la lecture de l'emplacement 0xfdfdfdfd.

3Fred9
|
Bonjour,
Encore merci mezaya pour cette piste. J'ai donc modifié l'allocation en mémoire de I comme cité... mais rien n'a changé...
Je rajoute le code de la fonction FindInstance afin d'y voir plus clair...
Code C/C++ : Instance_s *FindInstance(long I)
{
Instance_s *Instance;
for (Instance = InstanceList; Instance && (Instance->Instance != I);
Instance = Instance->Next);
return Instance;
}
Encore merci pour votre aide...
Fred
|
|
lundi 29 mars 2010 à 11:49:36 |
Re : [C++] Violation d'accès lors de la lecture de l'emplacement 0xfdfdfdfd.

3Fred9
|
Réponse acceptée !
Bonjour,
En fait le problème se situait dans une autre fonction où le pointeur newh était initialisé avec Code C/C++ : newh = new char [len_newh]
mais dont l'espace mémoire n'était pas libérée...
Code C/C++ : bool ACG_IMPORT WORD97_ChangeString(ObCharFld &RS, ObCharFld &OldHeader, ObCharFld &OldSeparator, ObCharFld &NewHeader, ObCharFld &NewSeparator)
{
int len_olds;
int len_newh = 10240;
int len_news;
int n;
char *oldh = OldHeader.GetText();
char *olds = OldSeparator.GetText();
char *newh;
char news[128];
if (!Is_FCT_loaded(Convert))
Convert = (TConvert)GetProcAddress(word_hm, "Convert");
if (!Is_FCT_loaded_Msg(Convert))
return (false);
/* verification des parametres pour eviter un SEGVIO */
if (!NewSeparator.GetText() ||
!oldh ||
!olds ||
(len_olds = strlen(olds)) == 0 ||
(len_news = Convert(news, NewSeparator.GetText())) == 0 ||
strncmp(oldh, olds, len_olds)) {
RS.SetText("ERR");
return false;
}
oldh += len_olds; // suppression du separateur en debut de chaine
/* allocation d'une chaine pour le nouvel header */
newh = new char [len_newh];
n = 0;
newh[n++] = '\"';
while (*oldh) {
if (!strncmp(oldh, olds, len_olds)) {
/* C'est un separateur !
=> remplacer ce bazar par le nouveau separateur */
strcpy_s(&newh[n], len_newh, news); /* remplace par le nouveau separateur */
while (newh[n]) n++; /* se positionne a la fin */
oldh += len_olds; /* deplacement dans la chaine */
} else
/* C'est un caractere comme un autre */
newh[n++] = *oldh++;
/* petit test pour eviter que le buffer soit trop petit */
if (n >= len_newh - len_news - 1) {
char *tmp;
int new_len;
new_len = len_newh * 2;
tmp = new char [new_len];
memcpy(tmp, newh, len_newh);
delete newh; // dbg
newh = tmp;
len_newh = new_len;
}
}
/* fermeture du nouvel header */
newh[n++] = '\"';
newh[n] = '\0';
NewHeader.SetText(newh);
RS.SetText(" ");
return true;
}
Le problème est que la libération échoue après la commande
Code C/C++ : strcpy_s(&newh[n], len_newh, news)
J'ai donc remplacé tout ce code en utilisant la classe string qui est beaucoup plus sûre et demande moins de ligne de code...
Fred
|
|
Cette discussion est classée dans : code, instance, header, char, len
Répondre à ce message
Sujets en rapport avec ce message
Autre question sur les pointeurs [ par Darkneon ]
Salut,J'ai le code suivant.#include char strA[27] = "abcdefghijklmnopqrstuvwxyz";int main(void){ char *pA;
#define [ par ifren ]
bonjour,j'ai ces deux code #ifndef LFAdbuf #define LFAdbuf LFA::__instance()->__buffer="" #endif // LFAdbufet j'ai un autre code #define LFAdbu
conversion char-->hexadécimal [ par ivdz ]
Bonjour,Est-ce que quelqu'un sait convertir un char en sa valeur hexadécimal ?Voici ce que j'ai essayé :char mot[]="255";int hexa;sscanf(mot
"désallocation" inopinée [ par vecchio56 ]
J'ai touvé un truc bizarre avec Visual C++ 6: le code suivant plante:#include void f(char* a){ a = new char[100]; // alloue de la
Char et caractère NULL [ par Arecibo ]
Lorsque je déclare : char Texte[16];est ce que je déclare :- une variable de type char de 16 caractères PLUS le caractère NULLou- une vari
Liberation de la mémoire [ par Xentor609 ]
Salut,Voici le code qui me pose un pitit probleme:char* fonction(){char* buf=new char[MAX_BUF];//traitement du bufreturn buf;}void MyFunc()<
Erreur DeviceIoControl ??? pk acces refusé ? [ par akk ]
Bonjour,Voila lorsque j'execute ce code :(on passe le nom du lecteur en parametre exemple : main C)#include #include <iostre
Pointeur et liberation de memoire [ par Darkneon ]
Salut, J'avais un probleme apres que je liberais de la memoire allouer a un pointeur, le message "Null pointer assignment" m'apparaisait toujours. Le
mon prog plante [ par lcampeur ]
Voilà, j'ai un programme qui consiste a envoyer des fichiers quelconques sur des postes référencés précedemment. Je dois pouvoir envoyé plusieurs fich
Conversion d'un char en LPCSTR ? [ par Xilofeon ]
Bonjour d'un débutant en C++Voila j'arrive pas à convertire un char en LPCSTRVoici la parti du code ki me pose pb :...void LitTexte(HKEY HK,
Livres en rapport
|
Derniers Blogs
JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|