J'ai une structure malloc () d, et après les utiliser, je veux libérer () cela, mais mon programme gèle ici. Quelqu'un peut-il me dire, ce que je fais mal?
Voici mon code: P>
struct data { char *filename; char *size; }; //primarypcs is a long type variable struct data *primary = (struct data *)malloc( primarypcs * sizeof( struct data ) ); memset( primary, 0, sizeof(struct data *) * primarypcs ); ... ... ... for ( i = 0; i < primarypcs; i++ ) { free( primary[i].filename ); //<----my program freezes here free( primary[i].size ); //<----or here } free( primary );
8 Réponses :
Comment sont les cordes de la structure allouées? S'ils sont statiquement attribués aux constantes, ne leur libérez pas de cette façon, et tout ce qui est nécessaire, c'est Si les pointeurs de cordes sont définis par Malloc () ou CalloC (), c'est la bonne manière. P> gratuit (primaire); code> libérant quelque chose qui n'était pas maladraté donnera une saisie de coeur . P>
Vous ne présentez pas tout le code, où beaucoup de choses peuvent se tromper, mais une erreur est déjà évidente. La ligne ne fait pas ce que vous pensez que cela fait. Il ne s'agit pas de zéro de la matrice entière due à une erreur de type dans note no. code> * code> sous en général, afin de réduire les chances de telles erreurs Il est préférable d'éviter de mentionner les noms de type dans votre programme, sauf dans les déclarations. Étant donné que votre question est étiquetée C ++ (même si elle ressemble sûrement à c), il n'est pas possible de se débarrasser de types de jeux de type sur et, comme note latérale, si votre code était destiné à être C ++, vous pouvez obtenir le même résultat de manière beaucoup plus élégante, compacte et portable p> Bien sûr, dans ce cas, vous devrez distribuer la mémoire à l'aide de la fonctionnalité C ++ appropriée au lieu de Tailleof code>. C'était probablement censé être p>
taille de code>. En raison de cette erreur, la plupart des pointeurs de votre matrice contiennent des ordures comme leurs valeurs initiales. Si vous ne les définissez pas sur quelque chose de significatif dans le code omis, vos appels vers
GRATUIT CODE> recevront des arguments de déchets et échoueront. P>
malloc code>, mais sinon je dirais que ce qui suit a l'air mieux p >
gratuit code>. P> p>
Salut! Merci de vous pour votre aide. C'était l'une de mes erreurs, BTUT après avoir corrigé mon code par votre réponse, mon programme toujours gelé. Plus tard, j'ai réalisé que j'y ai mal ayé une de mes variables, et je ne faisais que la mémoire pour 5 articles, mais j'ai inséré plus de 5 articles dans la structure. Merci encore!
Remplacement de la boucle pour la boucle en bas de votre code avec gratuit (primaire); code> devrait fonctionner. P>
En effet, vous n'avez pas explicitement attribué la mémoire pour juste Cette question a été étiquetée C ++. Donc, la manière C ++ est d'utiliser pour les différences entre dans c ++ fort>, il vous suffit d'écrire p> nom de fichier code> et
de taille code>. Tellement essayant de faire
gratuit (primaire [i] .filename); code> ou
gratuit (primaire [i] .Size); code> invoquerait
gratuit (primaire) code> est suffisant. p>
nouveau code> au lieu de
malloc code> pour les types définis par l'utilisateur. P>
nouveau code> et < Code> MALLOC CODE> Jetez un coup d'œil à Ceci . p>
Le code de l'échantillon peut être considéré comme ok, présumant individuellement Malloc le nom de fichier. Avoir une «taille» de Malloc'ed semble suspicieusement buggy, une taille_t conviendrait probablement mieux (à moins que ce soit vraiment une chaîne de charme)
Ceci corrige votre problème dans MEMSET, qui a provoqué toutes sortes de problèmes pour vous.
memset( primary, 0, sizeof(struct data) * primarypcs );
Si vous faites cela en C ++, vous ne devez pas utiliser quelque chose comme: à la place, vous devez utiliser quelque chose comme: P> struct data {
std::string filename;
std::string size;
};
std::vector<data> primary(primarypcs);
Comme d'autres l'ont dit, il y a deux choses évidemment erronées dans l'extrait que vous avez montré:
nom de fichier code> et Taille code> membres des Structs vient d'attribuer, Li>
- Votre
memset () code> appel utilise la mauvaise taille. li>
ol> Votre memset () code> L'appel pourrait être simplifié et corrigé par: p> xxx pré> Il y a un autre problème subtil avec votre code: C Standard ne garantit pas que tous les bits-zéro sont la constante de pointeur NULL (c.-à-d. NULL), de sorte que MEMSET () n'est pas la bonne façon de définir un pointeur sur null code>. Une manière portable de faire ce que vous voulez faire est la suivante: p> xxx pré> pour allouer la mémoire pour nom de fichier code> et taille code>, il dépend de ce que vous voulez. Disons que vous déterminez que nom de fichier code> nécessite n code> octets et Taille code> nécessite m code>. Ensuite, votre boucle change à quelque chose comme ceci: p> xxx pré> Vous pouvez omettre la multiplication avec Tailleof * primaire [i] .filename code> et et et et et et taille de * primaire [i] .Size code> à partir de ce qui précède si vous souhaitez: c garantit que tailleOf (char) code> est 1. J'ai écrit ce qui précède et pour le cas lorsque Nom de fichier code> et Taille code> Modifier les types. p> Aussi, notez que si nom_file code> est une chaîne de longueur k code> k code> , alors vous avez besoin de (k + 1) code> octets pour celui-ci, en raison de la terminaison 0 code> (donc n == k + 1 code> ci-dessus). P> Si je devais supposer, vous voulez code> Taille code> pour stocker la longueur du nom de fichier correspondant code>? Si tel est le cas, taille code> ne doit pas être un char * code> mais un taille_t code>. Mais puisque je ne sais pas comment vous envisagez d'utiliser nom de fichier code> et (code> code>, je ne suis pas sûr. P> Assurez-vous de vérifier la valeur de retour de malloc () code>. Il renvoie null code> pour échec. J'ai omis le chèque du code ci-dessus pour la simplicité. P> Votre message a été étiqueté C ++ aussi, donc si vous êtes prêt à utiliser C ++, une solution C ++ est également disponible. P> P >
Salut! Comment dois-je attribuer correctement la mémoire pour le nom de fichier et la taille?
Salut! la taille est char * dans un but. Je reçois la taille du fichier dans une longue, mais plus tard, je dois l'utiliser comme un caractère, alors je le convertit de Int en caractères, puis la stocker dans la structure.
Vous avez omis de déformer l'ensemble de la matrice entraînant un pointeur de mémoire à déchets libérés. Utilisez calloc au lieu de MALLOC / MEMSET pour éviter cette erreur:
for (i = 0; i < primarypcs; ++i) { primary[i].filename = malloc(...); primary[i].size = malloc(...); }
Je ne vois pas que vous affectation de mémoire pour
nom de fichier code> et
taille code>.
Oui, vous trouverez un bogue dans votre code: Dans le MALLOC, vous utilisez Tailleof (Struct Data) qui semble correct, mais dans Memset, vous utilisez Tailleof (Struct Data *) qui est la moitié de la taille. Cela signifie que vous n'avez que la moitié de la mémoire éteinte et que le dernier 1/2 de la mémoire fera la barre lorsque vous essayez de le libérer. La réponse devrait être libre (primaire); Et rien de plus
S'il s'agit de C ++, vous devez utiliser de nouvelles et supprimez.
@Xorlev: J'ai déjà mentionné que dans ma réponse. Voir ma réponse ci-dessous.
Vous devez sélectionner C ++ ou C comme langue. Votre échantillon est en C, pas C ++.
Sur la base de votre deuxième édition, vous voulez
Taille code> d'un type intégré, tel que
Taille_t code>, pas
char * code>. Voir ma réponse pour plus de détails.