将临时的 AnsiString 或 UnicodeString 对象作为函数的参数总是安全的吗?
Is it always safe to give a temporary AnsiString or UnicodeString object as parameter to a function?
假设我们有一个来自其他地方的 char 字符串,稍后用作接受宽字符串的函数的输入参数。
在变体 1 中,从 char 字符串创建 UnicodeString,并在第二步中用作指向 LoadLibrary() 函数的 wchar_t* 指针。
如变体 2 中所写,将其缩短为一个代码行总是安全的吗?特别是,临时 UnicodeString 对象在函数本身的使用期间是否总是足够长?会不会有什么特殊情况会提前销毁对象?
char *libstr = "test.dll";
//...
//Variant 1
UnicodeString us(libstr);
HINSTANCE lib = LoadLibrary( us.w_str() );
//Variant 2
HINSTANCE lib = LoadLibrary( UnicodeString(libstr).w_str() );
谢谢,
编辑:
@大卫赫弗南
感谢您指出有关 C++ 中临时参数生命周期的已回答问题
由于这是 Delphi 和 C++ Builder 中 UnicodeString 和 AnsiString 对象的特定问题,并且这些对象是使用 Pascal 在 VCL 中编码的,我仍然想知道这个主题,我觉得你的 link 确实没有涵盖主题 100%,尽管它对主题很有帮助。谢谢。
我最初将其作为这个问题的副本关闭:C++: Life span of temporary arguments?
我相信关闭是有效的。那里的答案告诉你:
Temporary objects are destroyed as the last step in evaluating the full-expression that (lexically) contains the point where they were created.
这意味着您的临时文件在函数调用后仍然存在并且是安全的。
您认为所讨论的 类 不是 C++ 类,因此反对闭包是重复的。但这是一个错误的信念。它们是 C++ 类。并且适用 C++ 规则。
假设我们有一个来自其他地方的 char 字符串,稍后用作接受宽字符串的函数的输入参数。
在变体 1 中,从 char 字符串创建 UnicodeString,并在第二步中用作指向 LoadLibrary() 函数的 wchar_t* 指针。
如变体 2 中所写,将其缩短为一个代码行总是安全的吗?特别是,临时 UnicodeString 对象在函数本身的使用期间是否总是足够长?会不会有什么特殊情况会提前销毁对象?
char *libstr = "test.dll";
//...
//Variant 1
UnicodeString us(libstr);
HINSTANCE lib = LoadLibrary( us.w_str() );
//Variant 2
HINSTANCE lib = LoadLibrary( UnicodeString(libstr).w_str() );
谢谢,
编辑: @大卫赫弗南 感谢您指出有关 C++ 中临时参数生命周期的已回答问题 由于这是 Delphi 和 C++ Builder 中 UnicodeString 和 AnsiString 对象的特定问题,并且这些对象是使用 Pascal 在 VCL 中编码的,我仍然想知道这个主题,我觉得你的 link 确实没有涵盖主题 100%,尽管它对主题很有帮助。谢谢。
我最初将其作为这个问题的副本关闭:C++: Life span of temporary arguments?
我相信关闭是有效的。那里的答案告诉你:
Temporary objects are destroyed as the last step in evaluating the full-expression that (lexically) contains the point where they were created.
这意味着您的临时文件在函数调用后仍然存在并且是安全的。
您认为所讨论的 类 不是 C++ 类,因此反对闭包是重复的。但这是一个错误的信念。它们是 C++ 类。并且适用 C++ 规则。