2010-02-23 4 views
1

Je dois stocker un VARIANT de type bstr dans un vecteur stl. Je ne suis pas sûr comment je devrais stocker le type VARIANT dans le vecteur.Comment stocker un 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); 

Cette implémentation provoque-t-elle une fuite de mémoire? Quelle serait la meilleure façon de stocker VARIANTS?

Merci

+0

Que voulez-vous dire "Cette implémentation provoque-t-elle une fuite de mémoire?" La façon dont vous stockez le VARIANT est très bien pour autant que je sache. –

+0

Je pense qu'une copie de VARIANT est stockée dans le vecteur. Alors SysAllocString() cause une fuite de mémoire, puisque je ne libère pas mon objet original. Mais je ne suis pas sûr à ce sujet. C'est pourquoi j'ai besoin d'aide. – Nimo

Répondre

5

Oui, vous fuyez la mémoire. Chaque fois que vous allouez de la mémoire à la famille SysAllocString, vous devez soit la libérer en utilisant SysFreeString, soit la transférer à quelque chose qui se chargera de la libérer. Le type VARIANT ne nettoie pas sa propre mémoire.

Vous avez deux options pour le fixer:

  • Utilisez CComVariant ou variant_t. Il fournit un opérateur =, des constructeurs de copie et un destructeur qui gère la mémoire pour vous. L'inconvénient de les stocker dans un vecteur est que les copies temporaires seront créées et détruites (comme si vous aviez stocké std :: string). C'est la solution la plus simple et la mieux adaptée.

  • Appelez SysFreeString sur chaque chaîne dans vec_MyVec lorsque vous avez terminé. C'est plus efficace mais aussi beaucoup plus sujet aux erreurs et difficile à faire correctement, surtout en considérant la sécurité des exceptions.

  • Stockez un vecteur de std::tr1::shared_ptr<CComVariant>, ceci empêchera la création de copies temporaires, mais vous devrez plutôt compter sur le compte de référence.

Questions connexes