2011-04-21 3 views
0

j'ai signé avec les étoiles les 2 lignes qui créent le problème.problème dans l'allocation de la mémoire dans Linux

La première ligne alloue de la mémoire pour le fichier journal, qui sera utilisé dans la deuxième ligne signée. à la deuxième rangée signée il y a un problème de faute de segmentation. Ceci est dû au fait que "logfile" n'est pas alloué. Je suis sûr de cela parce que si j'alloue la mémoire dans load() cela fonctionne. Cependant je veux allouer la mémoire dans le constructeur de la classe et non dans la méthode load().

Je ne comprends pas pourquoi ça ne marche pas! Ceci est ma première fois sur Linux et donc peut-être que je fais quelque chose de mal!

Merci, Marco

server::server(){ 
    port = 0; 
    serverup = 0; 
    loaded = 0; 
    logfile = (char *) malloc(SERVER_PATHS_SIZE*sizeof(char)); //**************************** 
} 

int server::load(int in_id, char *in_name, char *in_ip, int in_port, 
       char *in_rcon, char *in_logfile){ 

    int err; 

    sprintf(name, "%s\x00", in_name); 
    sprintf(ip, "%s\x00", in_ip); 
    port = in_port; 
    sprintf(rcon, "%s\x00", in_rcon); 
    sprintf(logfile,"%s\x00", in_logfile); //********************************** 

    err = urt.set(ip, port, rcon); 
    if(err < 1){ 
     printf("server::load(): error from urt.set()\n"); 
     return 0; 
    } 

    printf("server::load(): server %d loaded!\n", id); 
    loaded = 1; 

    return 1; 
} 
+2

Veuillez réduire votre code à un exemple fonctionnel (c'est-à-dire compilable, exécutable) qui illustre le problème. Sinon, nous ne pouvons que deviner où est le problème ... – sleske

+0

Nous ne pouvons pas voir où 'logfile' est déclaré. Est-ce une variable membre du serveur de classe? Est-ce global? Rendre vos exemples compilables autonomes est crucial pour le débogage. – DevSolar

+0

lors de la programmation de C++, 'new' est généralement préféré à' malloc' – knittl

Répondre

0
  1. Je ne vois pas le Destructeur de la classe de serveur. Avez-vous un destructeur qui libère la mémoire?

  2. Je ne vois pas le code qui crée et utilise l'objet serveur. Se pourrait-il que vous créiez l'objet serveur mais en fassiez une copie, et le problème se produit parce que vous n'implémentez pas correctement la sémantique de copie?

+0

(2) Non, il ne pouvait pas, à cause de (1). :) –

+0

Dark Falcon, vous êtes un génie !! C'était le problème !! Merci beaucoup! – Marco

+0

Fondamentalement, le constructeur n'a pas été appelé ... probablement je créais l'objet serveur dans le mauvais sens! merci à tous pour les réponses! – Marco

4

Je pense que vous essayez de nullterminate in_logfile et in_rcon

Cela ne fonctionnera pas avec printf car printf nécessite une chaîne vide terminé comme arguments à% s en premier lieu.

charptr[known_length] = 0 

au lieu

+1

Pour éléborer un peu, l'erreur de segmentation se produit car l'absence de terminaison nulle dans l'entrée d'origine de 'sprintf' provoque la lecture des données au-delà de la fin de l'entrée d'origine, entraînant des lectures invalides.En outre, vous essayez d'affecter beaucoup plus de données aux tableaux de sortie que vous le pensez, ce qui entraîne des écritures non valides. –

1

C'est certainement pas une réponse, mais en C++ développer vous aidera à éviter les problèmes de mémoire que vous obtenez avec votre code C avec classes.

Utilisez des chaînes std ::, puis les copier sera trivial (comparé à sprintf), et il sera beaucoup plus sûr. Utiliser le caractère obsolète * rend les choses très confuses.

Un bon effet secondaire est que vous n'aurez pas besoin de faire une allocation manuelle de la mémoire (avec malloc ou nouveau), et d'éliminer tout risque de fuite de mémoire.

+0

L'utilisation de 'char *' pour gérer les tableaux de caractères n'est pas obsolète. (Bien que les littéraux de chaîne de liaison à 'char *' plutôt que 'char const *' est.) –

Questions connexes