Question

J'ai du code en C # qui a un wrapper. Ce wrapper est utilisé dans une application native c ++. Le code c ++ utilise une méthode qui renvoie un tableau d'instances d'une classe à partir de la bibliothèque c #. Les instances proviennent d’un SafeArray comme suit:

for (long i =min; i<=max;i++)
    {   
        IMyInterface *l = (IMyInterface *)malloc(sizeof IMyInterface );

        SafeArrayGetElement(array,&i, &l);
    <other code>

    }

Je souhaite libérer la mémoire allouée pour l'instance l, mais si j'appelle

free(l)

alors je reçois un crash.

j'ai essayé

VariantClear ((VARIANT*)l);

et en utilisant

SafeArrayDestroy(array)

mais il me manque encore 4 octets pour chaque instance du tableau.

des idées sur la manière dont je devrais libérer cette mémoire?

Était-ce utile?

La solution

Ce code semble un peu confus: vous transmettez " sizeof IMyInterface " to malloc (), qui sera la taille en mémoire d'une instance de IMyInterface, et non un pointeur sur celle-ci: vous pourriez bien vouloir dire "size of IMyInterface *" si vous souhaitez allouer de la mémoire pour un pointeur.

Cependant, en regardant cela, cela n’a aucun sens non plus: ne seriez-vous pas mieux de ne pas faire malloc () du tout? Le dernier argument de SafeArrayGetElement () est un pointeur sur la mémoire qui contiendra le résultat. Le contenu de l (le pointeur renvoyé par malloc ()) sera alors écrasé (c'est pourquoi Free () vous bloque). En d'autres termes, cela devrait fonctionner:

IMyInterface *l;
SafeArrayGetElement(array,&i, &l);

Sans savoir exactement ce que contient le tableau, il n’est pas facile d’en être sûr, mais il semble que vous soyez dérouté par l’ancien problème C / C ++ de différence entre les pointeurs et les objets qu’ils pointent.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top