Да, у вас утечка памяти.
Всякий раз, когда вы выделяете память семейству SysAllocString
, вы должны либо освободить ее, используя SysFreeString
, либо передать ее чему-то, что возьмет на себя ответственность за ее освобождение. Тип VARIANT не очищает собственную память.
У вас есть несколько способов исправить это:
Используйте CComVariant
или variant_t
. Он предоставляет оператор =, копирует конструкторы и деструктор, который управляет памятью для вас. Недостатком их хранения в векторе является то, что временные копии будут создаваться и уничтожаться (так же, как если бы вы хранили std :: string). Это самое простое и предпочтительное для меня решение.
Вызовите SysFreeString
для каждой строки в vec_MyVec
, когда вы закончите. Это более эффективно, но при этом гораздо более подвержено ошибкам и трудно сделать правильно, особенно если учитывать безопасность исключений.
Сохраните вектор std::tr1::shared_ptr<CComVariant>
, это предотвратит создание временных копий, но вместо этого у вас будут накладные расходы на подсчет ссылок.