c++ - 当函数返回 CString 时会发生什么?

标签 c++ visual-c++ mfc object-lifetime

我对内存和指针有非常透彻的理解,但我需要稍微复习一下 C++ 在幕后如何管理某些对象。

考虑以下代码:

void Test()
{
    LPCTSTR psz = (LPCTSTR)GetString();
}

CString GetString()
{
    return CString(_T("abc"));
}

问题:

  1. 有人可以充实 GetString() 是如何返回一个本地对象并且它在调用者中仍然有效的吗?

  2. GetString()的结果没有存储在任何地方,如何删除?

  3. psz 是否保证“安全”用于整个 Test() 函数?

很抱歉在此示例中使用旧类,但这正是我现在正在使用的。

最佳答案

  1. GetString 返回本地对象的拷贝(尽管实际复制可能被省略,本地临时对象直接返回)。

  2. GetString() 的返回值是一个临时值。与大多数临时变量一样,它会在完整表达式的末尾(本质上是在分号处)自动销毁。

  3. psz 获取指向由该临时对象管理的缓冲区的指针。一旦临时对象被销毁,psz 就会变成悬空状态。任何实际使用它的尝试都会表现出未定义的行为。

关于c++ - 当函数返回 CString 时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42423326/

相关文章:

visual-studio - 如何在 VS2019 中静态链接 OpenSSL 库?

c++ - 我的程序有什么错误?

c++ - 在 vector 的 vector 中搜索和计数对象对的最佳数据结构是什么

c++ - 在 Visual C++ 中将图片从打开的文件对话框导入图片框

c++ - 在 MFC 中平滑地从左向右移动椭圆对象

c++ - 为什么我的类析构函数会立即被调用?

mfc - 是否可以在 MFC 中加宽消息框?

c++ - 隐式定义的用户转换运算符支持的操作

c++ - boost::shared_ptr 默认构造导致成员函数消失?

c++ - ARB_DEBUG_OUTPUT 的访问冲突