2012-06-21 2 views
1

Я считаю, что трудно найти четкие примеры, которые бы объяснить, как читать COleSafeArray ...Как читать COleSafeArray эффективно

Так у меня есть объект, который возвращает через функцию участницы _variant_t, что на самом деле является COleSafeArray. Я хочу прочитать его элемент и убедиться, что я не утечка памяти ...

Вот пример кода примера. Я просто пытаюсь прочитать элемент ifrst массива, который, как я полагаю, длинный. В массиве больше данных.

class ExampleObject 
{ 
    _variant_t GetArray(); 
}; 

//... 
long Read(ExmapleObject* ptr) 
{ 
    COleSafeArray the_array = ptr->GetArray(); 


    VARIANT value_temp; 
    VariantInit(&value_temp); 

    long index = 0; 
    the_array.GetElement(&index, &value_temp); 
    long my_result = value_temp.lVal; 

    return my_result; 
} 

В этом коде есть что-то неправильное, что может привести к утечке памяти?

+0

Да, если массив не содержит вариантов правильного типа, вы получите значение мусора и пропустите элемент. Проверьте value_temp.vt и используйте VariantClear() для освобождения памяти. –

+0

так что о 'COlseSafeArray' функции' Destroy' 'DestroyData'' DestroyDescriptor' и 'Clear'? Также какие типы требуют вызова 'VariantClear'? – Arthur

+0

@jules: не забудьте наградить Романа R – Goz

ответ

1

Эффективное считывание COleSafeArray Содержание касается надежности и производительности.

Чтобы надежно читать, избегайте мусора и утечки, вы должны проверить типы самого массива и его элементы. Поле .vt указывает тип массива, который может быть массивом определенного [фиксированного] типа или массива VARIANT, который, в свою очередь, может вставлять подмассивы.

У вас есть возможность получить отдельные элементы, используя GetElement, и в этом случае if the data element is a string, object, or variant, the function copies the element in the correct way, и, следовательно, вы несете ответственность за очистку копии. Чтобы сделать это для вас классом-оболочкой, введите свои элементы в переменную класса CComVariant, в отличие от VARIANT struct (~CComVariant очистит вас для вас).

Или, если вы проверили тип, вы можете заблокировать/разблокировать массив и получить прямой доступ к элементам, управляемым массивом. Вы можете предпочесть этот метод для производительности, потому что вы блокируете один раз и копируете, если необходимо, в отличие от наличия блокировок и копий на элемент в предыдущем параметре доступа.

~COleSafeArray destructor очищает элементы массива, поэтому вам не нужно их явно уничтожать/освобождать.

+0

Я не понимаю проблему блокировки/разблокировки. Также в чем разница между CComVariant и _variant_t? – Arthur

+0

'1' - Данные, зависящие от версии, блокируются при доступе. 'GetElement' делает это автоматически, каждый раз, когда вы получаете доступ к отдельному элементу. Другой вариант - явно «блокировать» один раз и иметь необработанный указатель для доступа к данным без блокировок для каждого элемента. '2' - оба класса (просто разные) с деструкторами для очистки данных. –

Смежные вопросы