Tu alloue data.ip avec l'opérateur "new[]" et le delete avec delete au lieu de "delete[]"
Pour l'autre soucis, je ne connais pas SOCKADDR_IN et j'ai pas le temps de chercher maintenant donc à voir plus tard pour ma part
EDIT : et dans la fonction accept, t'es sûr qu'il faut que tu passes l'adresse de sinsize que tu n'utilises même pas ensuite ? un NULL ne suffirait pas ? (pareil, pas le temps d'aller voir la doc de accept de mon côté)
- Edité par romantik 28 août 2018 à 18:08:56
Dream on, Dream on, Dream until your dream comes true
The inet_ntoa() function converts the Internet host address in, given
in network byte order, to a string in IPv4 dotted-decimal notation.
The string is returned in a statically allocated buffer, which subse‐
quent calls will overwrite.
qui retourne l'adresse d'un tampon statique qui va être reutilisé. Quand on en fait un delete/free, c'est normal que ça se passe mal.
Ce qu'il faut stocker dans la structure DATA, ce n'est pas l'adresse de ce tampon, mais une copie de son contenu.
Une bonne idée, puisque tu écris du C++, serait d'en faire une std::string.
Ensuite, ça serait peut être bien que l'échec d'accept provoque une exception, puisqu'on en dispose.
pourquoi ça se passe mal si on désalloue une variable statique ? Veux-tu dire qu'il fallaiit désallouer un pointeur statique plutôt ?
je cite :
qui retourne l'adresse d'un tampon statique qui va être reutilisé. Quand on en fait un delete/free, c'est normal que ça se passe mal.
Merci
Pourquoi ça se passerait bien ?
Une variable statique n'a pas été allouée par malloc().
Pour résumer, il y a différents classes de variables
variables locales d'une fonction
void foo()
{
int var = 12;
...
}
Elles font partie du "cadre de pile" qui est crée quand on appelle la fonction. Elle sont donc allouées (dans la plupart des implémentations) dans le segment de pile en entrant et désallouées en sortant automatiquement. Et pour cette raison on parle d'allocation automatique.
les variables globales
char version[] = "v3.14";
L'espace qu'elles occupent est réservé dès le chargement du programme. Ce sont des variables statiques. Elles habitent dans le segment de données.
les variables locales déclarées statiques
// cette fonction retourne successivement 1, 2, 3, ...
int prochain_numero_de_serie()
{
static int dernier_numero = 0;
dernier_numero += 1;
return dernier_numero;
}
ce sont aussi des variables statiques, leur visibilité étant simplement limitée à la fonction où elles sont déclarées.
Enfin, à côté de ça, il y a l'allocation dynamique, qui consiste à allouer/liberer explicitement de l'espace sur le "tas" (heap)". Espace que l'on manipulera par l'intermédiaire d'un pointeur, malloc et free. Mais c'est une autre histoire.
Conclusion : la doc te dit que la fonction retourne l'adresse d'un tableau statique, le free() ne va certainement pas marcher sur un truc qui n'a pas été alloué dynamiquement par malloc().
@MichelBillaud, merci beaucoup pour tes explications claires
fuite de mémoire
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
git is great because Linus did it, mercurial is better because he didn't.
Discord NaN. Mon site.
git is great because Linus did it, mercurial is better because he didn't.