Освободите память от вызова SafeArrayGetElem? - PullRequest
0 голосов
/ 05 ноября 2008

У меня есть некоторый код в C #, который имеет оболочку com. Эта обертка com используется в собственном приложении c ++. В коде c ++ используется метод, который возвращает массив экземпляров класса из библиотеки c #. Экземпляры поступают из SafeArray следующим образом:

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

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

    }

Я хочу освободить память, выделенную для экземпляра l, но если я вызову

free(l)

тогда я получаю крах.

Я пытался

VariantClear ((VARIANT*)l);

и использование

SafeArrayDestroy(array)

но все еще протекает 4 байта для каждого экземпляра в массиве.

есть идеи, как мне освободить эту память?

1 Ответ

0 голосов
/ 05 ноября 2008

Этот код выглядит немного запутанным: вы передаете "sizeof IMyInterface" в malloc (), который будет размером в памяти экземпляра IMyInterface, а не указателем на него: вы вполне могли бы иметь в виду "sizeof IMyInterface * "если вы хотите выделить память для указателя.

Однако, глядя на это, это тоже не имеет никакого смысла: не лучше ли вообще не выполнять malloc ()? Последний аргумент SafeArrayGetElement () - это указатель на память, в которой будет храниться результат, поэтому содержимое l (указатель, возвращаемый malloc ()) будет просто перезаписано (поэтому free () дает вам сбой). Другими словами, только это должно работать:

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

Не зная точно, что находится в массиве, трудно быть уверенным, но похоже, что вас смущает старая проблема C / C ++, заключающаяся в разнице между указателями и объектами, на которые они указывают.

...