2016-07-11 20 views
1

Nehmen wir an, wir von woanders eine char string haben, die später als Eingangsparameter auf eine Funktion, die breite Strings akzeptiert verwendet wird.Ist es immer sicher, ein temporäres AnsiString- oder UnicodeString-Objekt als Parameter für eine Funktion anzugeben?

Bei Variante 1 wird eine von der Unicodezeichenfolge char und in einem zweiten Schritt als Wchar_t * Zeiger auf die Loadlibrary() Funktion erstellt wird.

Ist es immer sicher diese in eine Codezeile zu verkürzen, wie in Variante 2 geschrieben? Wird das temporäre UnicodeString-Objekt während seiner Verwendung in der Funktion selbst immer lange genug leben? Könnte es irgendwelche besonderen Umstände geben, die das Objekt zu früh zerstören würden?

char *libstr = "test.dll"; 
//... 

//Variant 1 
UnicodeString us(libstr); 
HINSTANCE lib = LoadLibrary(us.w_str()); 

//Variant 2 
HINSTANCE lib = LoadLibrary(UnicodeString(libstr).w_str()); 

Danke,

Edit: @ David Heffernan Dank für die an die beantworteten Frage zeigt in Bezug auf Lebensdauer von temporären Argumenten in C++ Da dies eine spezifische Frage für UnicodeString- und Ansistring-Objekte in Delphi und C++ Builder, und es werden diese Objekte in der VCL codiert Pascal verwenden, ich frage mich immer noch über das Thema und ich fühle mich Ihr Link Thema 100% erstreckt sich nicht auf, obwohl es sehr hilfreich, über das Thema ist. Vielen Dank.

+2

AnsiString und UnicodeString sind als Klassen in C++ implementiert, daher folgen sie denselben Regeln wie jede andere Klasse und unterliegen den gleichen Lebensdauerregeln. Nebenbei bemerkt, Sie sollten 'c_str()' anstelle von 'w_str()' verwenden. –

+1

Eine etwas verwandte Frage ist http://stackoverflow.com/q/13474486/3235496 (andere Situation, aber interessante Informationen). – manlio

+0

@manlio, interessante Informationen in der Tat, danke. –

Antwort

2

Ich schloss ursprünglich dieses als Duplikat dieser Frage: C++: Life span of temporary arguments?

Ich glaube, dass Schließung gültig ist. Die Antworten dort sagen Ihnen, dass:

Temporäre Objekte werden als der letzte Schritt bei der Auswertung der Voll-Ausdruck, der (lexikalisch) enthält den Punkt, wo sie erstellt wurden, zerstört.

Das bedeutet, dass Ihre temporäre überlebt den Funktionsaufruf und ist sicher.

Sie beanstandete als Duplikat der Schließung mit dem Argument, dass die Klassen in Frage Klassen nicht C++ waren. Aber das ist ein Irrglaube. Sie sind C++ - Klassen. Und die C++ Regeln gelten.

+0

Ich sehe deinen Standpunkt. Du hast die Frage für mich beantwortet. Danke noch einmal. –