Memoria libera da una chiamata SafeArrayGetElem?
Domanda
Ho del codice in C # che ha un wrapper com. Questo wrapper com viene utilizzato in un'applicazione c ++ nativa. Il codice c ++ utilizza un metodo che restituisce una matrice di istanze di una classe dalla libreria c #. Le istanze provengono da un SafeArray in questo modo:
for (long i =min; i<=max;i++)
{
IMyInterface *l = (IMyInterface *)malloc(sizeof IMyInterface );
SafeArrayGetElement(array,&i, &l);
<other code>
}
Voglio liberare la memoria allocata per l'istanza l, ma se chiamo
free(l)
poi ho un incidente.
Ho provato
VariantClear ((VARIANT*)l);
e usando
SafeArrayDestroy(array)
ma sto ancora perdendo 4 byte per ogni istanza dell'array.
qualche idea su come dovrei fare per liberare questa memoria?
Soluzione
Questo codice sembra un po 'confuso: stai passando " sizeof IMyInterface " a malloc (), che sarà la dimensione in memoria di un'istanza di IMyInterface, non un puntatore ad essa: potresti benissimo intendere "dimensione di IMyInterface *". se si desidera allocare memoria per un puntatore.
Comunque, guardandolo, anche questo non ha alcun senso: non staresti meglio a non fare affatto il malloc ()? L'ultimo argomento di SafeArrayGetElement () è un puntatore alla memoria che conterrà il risultato, quindi il contenuto di l (il puntatore restituito da malloc ()) verrà sovrascritto (motivo per cui free () ti dà un arresto anomalo). In altre parole, solo questo dovrebbe funzionare:
IMyInterface *l;
SafeArrayGetElement(array,&i, &l);
Senza sapere esattamente cosa si trova nell'array, non è facile esserne certi, ma sembra che ti stia confondendo con il vecchio problema C / C ++ della differenza tra puntatori e oggetti a cui puntano.