Как хранить ВАРИАНТ - PullRequest
       9

Как хранить ВАРИАНТ

1 голос
/ 23 февраля 2010

Мне нужно хранить ВАРИАНТ типа bstr в векторе stl. Я не уверен, как мне хранить тип VARIANT в векторе.

vector<VARIANT> vec_MyVec;

    VARIANT var_Temp;
    VariantInit(&var_Temp);
    var_Temp.vt = VT_BSTR
    var_Temp.bstrVal = SysAllocString("Test");

vec_MyVec.push_back(var_Temp);

Эта реализация вызывает утечку памяти? Как лучше всего хранить ВАРИАНТЫ?

Спасибо

1 Ответ

5 голосов
/ 23 февраля 2010

Да, у вас утечка памяти.

Всякий раз, когда вы выделяете память семейству SysAllocString, вы должны либо освободить ее, используя SysFreeString, либо передать ее чему-то, что возьмет на себя ответственность за ее освобождение. Тип VARIANT не очищает собственную память.

У вас есть несколько способов исправить это:

  • Используйте CComVariant или variant_t. Он предоставляет оператор =, копирует конструкторы и деструктор, который управляет памятью для вас. Недостатком их хранения в векторе является то, что временные копии будут создаваться и уничтожаться (так же, как если бы вы хранили std :: string). Это самое простое и предпочтительное для меня решение.

  • Вызовите SysFreeString для каждой строки в vec_MyVec, когда вы закончите. Это более эффективно, но при этом гораздо более подвержено ошибкам и трудно сделать правильно, особенно если учитывать безопасность исключений.

  • Сохраните вектор std::tr1::shared_ptr<CComVariant>, это предотвратит создание временных копий, но вместо этого у вас будут накладные расходы на подсчет ссылок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...