strtok et les fuites de mémoire

J'ai écrit une url simple analyseur à l'aide de strtok(). voici le code

#include <stdio.h>
#include <stdlib.h>
typedef struct {
char *protocol;
char *host;
int port;
char *path;
} aUrl;
void parse_url(char *url, aUrl *ret) {
printf("Parsing %s\n", url);
char *tmp = (char *)_strdup(url);
//char *protocol, *host, *port, *path;
int len = 0;
//protocol agora eh por exemplo http: ou https:
ret->protocol = (char *) strtok(tmp, "/");
len = strlen(ret->protocol) + 2;
ret->host = (char *) strtok(NULL, "/");
len += strlen(ret->host);
//printf("char at %d => %c", len, url[len]);
ret->path = (char *)_strdup(&url[len]);
ret->path = (char *) strtok(ret->path, "#");
ret->protocol = (char *) strtok(ret->protocol, ":");
//host agora é por exemplo address.com:8080
//tmp = (char *)_strdup(host);
//strtok(tmp, ":");
ret->host = (char *) strtok(ret->host, ":");
tmp = (char *) strtok(NULL, ":");
if(tmp == NULL) {
if(strcmp(ret->protocol, "http") == 0) {
ret->port = 80;
} else if(strcmp(ret->protocol, "https") == 0) {
ret->port = 443;
}
} else {
ret->port = atoi(tmp);
}
//host = (char *) strtok(NULL, "/");
}
/*
* 
*/
int main(int argc, char** argv) {
printf("hello moto\n");
aUrl myUrl;
parse_url("http://teste.com/Teste/asdf#coisa", &myUrl);
printf("protocol is %s\nhost is %s\nport is %d\npath is %s\n", myUrl.protocol, myUrl.host, myUrl.port, myUrl.path);
return (EXIT_SUCCESS);
}

Comme vous pouvez le voir, j'ai utiliser strtok() beaucoup donc je peux "tranche" de l'url. Je n'ai pas besoin de soutien url différente de l'adresse http ou https donc, la façon dont c'est fait résout tous mes problèmes.
Mon souci c'est que (c'est en cours d'exécution sur un dispositif intégré) - Suis-je perdre la mémoire ?
Quand j'écris quelque chose comme

ret->protocol = (char *) strtok(tmp, "/");

Et puis plus tard, appelez

ret->protocol = (char *) strtok(ret->protocol, ":");

Ne m'premier pointeur ret->protocole de détenus restent en mémoire ? J'ai pensé que je devrais peut-être mis du premier appel à la tmp pointeur, appel strtok pointant ret->protocole sur la partie droite de la chaîne (le deuxième appel) et puis free(tmp).

Ce que devrait être la meilleure façon d'utiliser strtok ?

Pour des raisons de sécurité, vous devriez vérifier pour résultat NUL après chaque strtok(). Juste au cas où votre " / " n'est pas là, vous n'avez pas besoin de choses exploser. Certaines peluches à des outils de type devraient se plaindre de ce genre de chose. Ne présumez pas que l'entrée sera correct.

OriginalL'auteur guigouz | 2009-09-29