Освободите память от вызова SafeArrayGetElem?
Вопрос
У меня есть некоторый код в 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 байта для каждого экземпляра в массиве.
есть идеи, как мне освободить эту память?
Решение
Этот код выглядит немного запутанным: вы передаете & sizeot IMyInterface " для malloc (), который будет размером в памяти экземпляра IMyInterface, а не указателем на него: вы могли бы иметь в виду " sizeof IMyInterface * " если вы хотите выделить память для указателя.
Однако, глядя на это, это тоже не имеет никакого смысла: не лучше ли вообще не выполнять malloc ()? Последний аргумент SafeArrayGetElement () - это указатель на память, в которой будет храниться результат, поэтому содержимое l (указатель, возвращаемый malloc ()) будет просто перезаписано (поэтому free () дает вам сбой). Другими словами, только это должно работать:
IMyInterface *l;
SafeArrayGetElement(array,&i, &l);
Не зная точно, что находится в массиве, нелегко быть уверенным, но похоже, что вас запутывает старая проблема C / C ++, заключающаяся в разнице между указателями и объектами, на которые они указывают.