Quelle est la bonne façon de faire cela: ou: p> où Je sais que je pouvais facilement faire cela: p> merci p> p> iError: getDescription code > est défini comme suit: p>
5 Réponses :
La référence BST est comptée, je doute sérieusement que cela fonctionnerait bien si vous utilisez GetAddress (). Malheureusement, le code source n'est pas disponible pour vérifier cela. Je l'ai toujours fait comme ceci:
BSTR temp = 0; HRESULT hr = p->GetDescription(&temp); if (SUCCEEDED(hr)) { _bstr_t wrap(temp, FALSE); // etc.. }
+1, la conversation de l'étant partagée de _BSTR_T ''s BSTR partageant d'autres instances me pose tout ce qui pourrait s'identifier directement à cela.
Ne devriez-vous pas utiliser joindre () code> au lieu de l'opérateur d'attribution?
Comme indiqué, la fonction getDescription code> attribue la mémoire à
TEMP code> avec
sysallocstring code>, et cette mémoire n'est jamais libérée. Vous devez appeler
sysfreestring (TEMP) code> ou assurez-vous que
enveloppe code> attache à cette mémoire et libère-le.
Suivi de la réponse de @ Hans - Le moyen approprié de construire le Le but ici est de minimiser le nombre de copies, mais d'éviter également les appels manuels vers _bstr_t code> dépend de si
getDescription code> vous retourne un
btr code> que vous possédez , ou un qui fait référence à la mémoire que vous n'avez pas à libérer.
SysfreString code> sur les données renvoyées. Je modifierais le code comme indiqué pour clarifier ceci: p>
une réponse tardive qui peut ne pas s'appliquer aux versions antérieures (ou ultérieures) de Visual Studio; cependant,
Vs 12.0 a le mais si à l'aide des opérateurs Donc, votre premier exemple pourrait plutôt ressembler à ce qui suit : p> Cette évaluation était basée sur _bstr_t cod> implémentation en ligne, et évidemment d'une instance interne
data_t code> est créée avec un
m_refcount code> de 1 lorsque vous appelez
getSTR () code> sur une vierge
_bstr_t code>. Donc le
_bstr_t code> Le cycle de vie dans votre premier exemple semble aller bien:
_bstr_t code> est sale, le code interne existant > M_WSTR CODE> Le pointeur sera écrasé, fuyant la mémoire précédente qu'elle a référencée. p>
suivants et >, _bstr_t code> peut être utilisé étant donné qu'il est d'abord effacé via
Attribuer (nullptr) code> . La surcharge fournit également la commodité d'utiliser l'opérateur d'adresse au lieu de
getbstr () code>; p>
comute.h code> de VS 12.0. P> p>
Merci beaucoup pour cela, j'ai voulu quelque chose comme cet opérateur pendant les vingt dernières années.
Ma réponse est aussi tardive. Supposons que vous ayez la signature par les règles de COM, la fonction pour l'opposé HRESULT PutDescription (BSTR NewDescription); code>. Dans ce cas, procédez comme suit
putdescription code> n'est pas autorisée à modifier ou même détruire le code transduit code >. P>
HRESULT getDescription (BSTR * PactualDescription); Code> Passer une VIRGIN
_BSTR_T CODE> au moyen de la fonction
getAddress () : P>
BSTR Bst = ::SysAllocString(L"Who would do that?");
_bstr_t GetDescr;
GetDescr.Attach(Bst);//GetDescr wraps Bst, no copying!
HRESULT hr = GetDescription(GetDescr.GetAddress());
_BSTR_T (et son CCOMBSTR ATL SIBLY) sont des propriétaires de ressources de BSTR. SPYPY DU CODE Il semble que "GetAddress" soit spécialement conçu pour le cas d'utilisation de la fonction de travail avec des paramètres de sortie BSTR où il est prévu que le client libère le BSTR.
Utilisation de 'getAddress ()' n'est pas équivalent à l'utilisation de '& getbstr ( ) 'Si le _BSTR_T possède déjà un BSTR. Etats MSDN: "libère toute chaîne existante et renvoie l'adresse d'une chaîne nouvellement allouée.". P> cavalier: Ce cas d'utilisation spécifique de "getAddress" n'est pas indiqué dans le Documentation; C'est ma déduction de regarder le code source et de l'expérience avec sa partie compteur ATL CCOMBSTR. P> P>