如果我有以下代码:

{
    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将能够读取原始字符串。

09-26 18:57