如果我有以下代码:
{
UnicodeString sFish = L"FISH";
char *szFish = AnsiString(sFish).c_str();
CallFunc(szFish);
}
那么,所创建的临时
AnsiString
的范围是什么?szFish
指向有效数据要持续多长时间?它对CallFunc
函数仍然有效吗?它的作用域仅持续一行还是整个块?
最佳答案
C++ 11标准$ 12.2.3说:
(强调我的)
还有其他注意事项,但不适用于这种情况。在您的情况下,完整表达式是此语句的指示部分:
char *szFish = AnsiString(sFish).c_str();
// ^^^^^^^^^^^^^^^^^^^^^^^^^
因此,立即分配了
szFish
,将调用临时对象的析构函数(即AnsiString(sFish)
),并释放其内部内存表示形式(c_str()
指向)。因此,szFish
将立即成为悬挂指针,并且任何访问都会失败。你可以通过说
CallFunc(AnsiString(sFish).c_str());
相反,如此处所示,临时变量将在完整表达式(即
;
处)之后再次被销毁,并且CallFunc
将能够读取原始字符串。