2011-03-14 4 views
1

Je travaille dans une fonction de langage C qui va être appelé à partir d'une application 4GL progrès et je me suis retrouvé avec les doutes suivants:Progress 4GL qui appelle une fonction C

La fonction C utilise malloc dynamiquement allouer un tableau de caractères et l'idée est que le pointeur qui alloue cette mémoire sera renvoyé au processus Progress 4GL qui a envoyé à l'origine un type de données MEMPTR pour contenir le résultat de la méthode C. Fondamentalement, le MEMPTR de Progress doit être envoyé à la fonction C pour "recevoir" le tableau généré C et l'utiliser quand la fonction lui revient de la fonction de C (passage par référence entre les deux langages où la méthode C "remplit" "la variable de progression MEMPTR).

Ma question est:

Lorsque la fin du processus de progression et la variable memptr est « libéré », est-il libérer la mémoire allouée malloc dans la fonction C ainsi?

et

Si je libérer la mémoire allouée malloc dans la fonction C Je suppose que le processus Progress recevront les données de déchets, Est-ce exact?

Merci pour votre temps et votre aide.

Salutations.

Répondre

3

4GL/ABL: How to Call WIN32 API Function: GetLongPathName

Progress 4GL ne gère pas cette mémoire pour vous. Vous devez fournir une méthode pour libérer/libérer cette mémoire. Oui, si vous avez accès à la mémoire de free() 'd, l'accès à celui-ci devient indéfini - il peut tomber en panne, il peut vous donner des données parasites, ou votre programme peut continuer à sortir sans erreur. Clause de non-responsabilité: Je travaille pour Progress.

0

Généralement, dans tout environnement de programmation multilingue, il est mauvais d'avoir ou d'attendre qu'une langue libère la mémoire allouée par l'autre. Le langage qui alloue des ressources (comme la mémoire) doit avoir un appel correspondant pour le libérer lorsque le client en a fini avec lui.

C en particulier n'a pas de garbage collection, donc toute mémoire allouée par elle doit être libérée manuellement.

Il existe une exception. Sur la plupart des plates-formes (non intégrées), toutes les ressources allouées seront récupérées à la fin de l'application. Donc, si l'allocation est une opération ponctuelle de démarrage seulement (plutôt que d'être faite dans une boucle ou quelque chose), alors il est généralement bon de laisser le système d'exploitation le récupérer quand le programme se termine, plutôt que de le faire manuellement.

Questions connexes