Visual C++ Free()

PRZYBYLSKI Messages postés 10 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 7 septembre 2003 - 4 sept. 2003 à 22:00
cs_Kaid Messages postés 949 Date d'inscription mardi 2 octobre 2001 Statut Membre Dernière intervention 8 juillet 2006 - 5 sept. 2003 à 00:23
#include <windows.h>
#include <stdio.h>
#include "stdafx.h"
Question au Pro?
Qu'es qui est faux docteur
Arrivé à free ça bombe
#include 
#include <stdlib.h>
#include <malloc.h>

void main(int argc, char* argv[])
{
char *string="free";
 	cout << string << endl;
system("PAUSE"); // ici tout est OK

free((char*)string);// Arrivé ici ça merde

cout << "Bravo ça marche" << endl;

cout << string << endl;

system("PAUSE");
}

4 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
4 sept. 2003 à 22:43
Pour sur que doit merder, free() ne s'applique qu'aux allocations faites avec malloc. Ici *string pointe sur une constante chaine !!!
BruNews, ciao...
0
blopera Messages postés 10 Date d'inscription samedi 23 août 2003 Statut Membre Dernière intervention 20 décembre 2004
4 sept. 2003 à 22:56
Slt

éh éh! free sans malloc... voilà pourquoi ça cloche!

tu n'as jamais alloué ton char*string... tu lui as juste affecté une adresse!

Bertrand
0
PRZYBYLSKI Messages postés 10 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 7 septembre 2003
4 sept. 2003 à 23:43
Au faite entre temps j’ai trouvé.
Mais j’ai un mal fou a comprendre car selon mon exemple :
Aidez moi a comprendre (au bout il y a sûrement la lumière)

char *string="free"; // ici on alloue une adresse soit, mais l’adresse de qui
len = strlen(string); //Ici la longueur est de 4
cout << string << endl; //print le contenu de string (free)
cout << len << endl; //print le contenu de len soit 4
system("PAUSE");

string = (char*) malloc( 1 ); Ici on rajoute 1 à la longueur
len =strlen(string);// Ici la longueur est de 5
cout << string << endl; // Mais ici c’est n’importe quoi comme txt
cout << len << endl; //Ici la longueur est de 5
system("PAUSE");

free((char*)string); // Ici on libere mais quoi
len =strlen(string);// L’espace reserve est toujours de 5
cout << string << endl;// Ici on voit que les caractères sont identique
cout << len << endl; Ici la longueur est de 5
system("PAUSE");

string = (char *)calloc( 1, sizeof( char ) );// Ici la reservation memoire disparaît
len =strlen(string); );// L’espace réserve est à 0

cout << string << endl; il y a plus rien
cout << len << endl;
system("PAUSE");

Résumer je ne vois très bien a quoi cela sert à reformater la mémoire j’imagine que tous les octet passe à 0.

On peut simplement remplacer par d’autre valeur. Mais ou j’ai loupé qlq chose ou ?? mais la mémoire reste alloué à la variable après free()

Voilà une réponse qui me met dans cette etat.
> Si la dll doit retourner un ptr de chaine faisant concat de ce qu'elle reçoit + ce qu'elle ajoute, faudra allouer la memoire dans la dll pour garantir la longueur necessaire au chainage.
> La dll retourne un char* que le prog affiche et ensuite fait le free(ptr).
> BruNews, ciao...
0
cs_Kaid Messages postés 949 Date d'inscription mardi 2 octobre 2001 Statut Membre Dernière intervention 8 juillet 2006 1
5 sept. 2003 à 00:23
Le résultat que tu cherches à obtenir est-il celui là:

DLL:

#define STR_PREFIXE "prefixe" 

char* mafonction(const char* inStr)
{
// Taille de la chaine finale
int tailleStr=strlen(inStr) + strlen(STR_PREFIXE) + 1;

// Allocation
char* outStr=new char [tailleStr];

strcpy(outStr, STR_PREXIFE);
strcat(outStr, inStr);

return outStr;
}


Programme de test:
char* inStr="chaine sans prefixe";
char* outStr=mafonction(inStr);

cout << outStr << endl;

// ...

delete [] outStr;


Kaid - kaid.fr.st
0
Rejoignez-nous