SysFreeString called twice?



  • Hi @all,

    ich mache seit lägerer Zeit mal wieder COM und dort wiedermal die häßlichen BSTR - Strings. Ich benutze aber lieber die Wrapper ala _bstr_t um mir das Aufräumen zu sparen.

    angenommen ich habe eine Funktion:

    void doSomeThing( BSTR strBlub )
    {
      //assume something usefull would be done here... 
      SysFreeString(strBlub);
    }
    
    {
      _bstr_t strString = "SomeString";
      doSomeThing( strString );
    }//here dtor of _bstr_t is called -> so I assume SysFreeString is called twice...
    

    ..wie beschrieben : ist das legal? Zumindest funktioniert es. Ich habe auch selber mal versucht, was passiert, wenn ich, mehrmals SysFreeString aufrufe - offenbar ist das auch kein Problem. Leider ist die Doku zu SysFreeString sehr dürftig. Ein delete scheint es jedenfalls nicht zu machen 🙂

    Danke und Viele Grüße,

    Tobias



  • http://msdn2.microsoft.com/en-us/library/ms221481.aspx

    => If bstr is NULL, the function simply returns.



  • wunderbar, ist aber nix neues und hat mit meiner Frage wohl eher nichts zu tun. In dem Fall ist es eben nicht null.

    folgendes Negativbeispiel funktioniert erschreckenderweise übrigens auch problemlos:

    strProc[0] = 'T';
    SysFreeString( strProc );
    strProc[0] = 'K';
    SysFreeString( strProc );
    


  • Du darfst sowas natürlich *nicht* machen!
    Du kannst auch mal den Debug-Heap aktivieren (gflags.exe), der wird Dir vermutlich eine Exception um die Ohren werfen... (oder auch das Application-Compatibility-Toolkit).



  • d.h. also, das in dem Fall, wo in einer Komponente der BSTR intern mit SysFreeString freigegeben wird sind für mich die bstr_t und CComBSTR tabu und ich muß mit AllocSysString und Co. herumhantieren?
    Wenn das halt so ist ist es halt so. Danke.


Anmelden zum Antworten