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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top