【发布时间】:2017-02-23 18:19:20
【问题描述】:
我对内存和指针有非常透彻的了解,但我需要稍微复习一下 C++ 如何在幕后管理一些对象。
考虑以下代码:
void Test()
{
LPCTSTR psz = (LPCTSTR)GetString();
}
CString GetString()
{
return CString(_T("abc"));
}
问题:
有人能具体说明
GetString()如何返回一个本地对象并且它在调用者中仍然有效吗?由于
GetString()的结果没有存储在任何地方,如何删除?psz是否可以保证“安全”地用于整个Test()函数?
很抱歉在这个例子中使用了旧的类,但这就是我现在正在使用的。
【问题讨论】:
-
LPCTSTR psz = (LPCTSTR)GetString();这种演员阵容完全错误,混淆了实际发生的一切。这是未定义的行为,仅此而已。 -
@πάνταῥεῖ:但它编译和运行都很好。所以我正在寻找原因的解释。
-
@πάντα 假设这是 MFC CString 类,我相信有一个用户定义的转换为 LPCSTR。
-
“但它编译得很好。” 就像
reinterpret_cast一样。您确定要申请reinterpret_cast? -
(1)
GetString返回一个本地对象的副本(虽然实际的复制可能会被省略,而本地临时对象直接返回)。 (2)GetString()的结果是临时的。像大多数临时变量一样,它会在完整表达式的末尾自动销毁(本质上是在分号处)。 (3)psz获取指向由该临时管理的缓冲区的指针。一旦临时对象被销毁,psz就会变得悬空。任何实际使用它的尝试都会表现出未定义的行为。
标签: c++ visual-c++ mfc object-lifetime