Frage

Ich habe einige Code in C #, die eine COM-Wrapper hat. Dieser COM-Wrapper wird in einer nativen C ++ Anwendung verwendet wird. Der C ++ Code verwendet ein Verfahren, das eine Reihe von Instanzen einer Klasse aus der C-Bibliothek # zurückgibt. Die Fälle stammen aus einem Safearray wie folgt:

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

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

    }

Ich möchte den Speicher für die Instanz l zugewiesen befreien, aber wenn ich rufe

free(l)

dann bekomme ich einen Absturz.

Ich habe versucht,

VariantClear ((VARIANT*)l);

und mit

SafeArrayDestroy(array)

ist aber undicht noch 4 Bytes für jede Instanz in dem Array.

irgendwelche Ideen, wie ich zu befreien, diesen Speicher gehen sollte?

War es hilfreich?

Lösung

Dieser Code sieht ein bisschen verwirrt: Sie vorbei „sizeof IMyInterface“ zu malloc (), die die Größe in Erinnerung an eine Instanz von IMyInterface sein wird, kein Zeiger auf sie: Sie gut „sizeof IMyInterface bedeuten könnte * ", wenn Sie Speicher für einen Zeiger zugewiesen werden sollen.

Doch es zu betrachten, das macht keinen Sinn entweder: Sie würden nicht besser dran, die malloc nicht tun () überhaupt? Das letzte Argument zu SafeArrayGetElement () ist ein Zeiger auf den Speicher, der das Ergebnis halten wird, so wird der Inhalt von l (der Zeiger von malloc () zurück) wird nur überschrieben werden (weshalb free () gibt Ihnen einen Absturz). Mit anderen Worten, sollte gerade diese Arbeit:

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

Ohne genau zu wissen, was in dem Array ist, ist es nicht einfach, sicher zu sein, aber es sieht aus wie Sie bekommen von der alten C / C ++ Ausgabe der Differenz zwischen Zeigern und den Objekten, die sie zu Punkt verwirren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top