【问题标题】:Am I correctly pointing a PCWSTR to a string literal?我是否正确地将 PCWSTR 指向字符串文字?
【发布时间】:2013-12-15 22:42:10
【问题描述】:

我对 C++ 有点生疏,所以我正在寻求有关字符串指针问题的帮助。

首先,让我们考虑一些带有整数的指针基础知识:

void SetBob(int* pBob)
{
    *pBob = 5;
}

int main(int argc, _TCHAR* argv[])
{
    int bob = 0;
    SetBob(&bob);
}

运行时,main() 创建一个整数并将其地址传递给 SetBob。在 SetBob 中,值(在 pBob 指向的地址处)设置为 5。当 SetBob 返回时,bob 的值为 5。

现在,让我们考虑一个字符串常量:

typedef wchar_t WCHAR;
typedef const WCHAR *PCWSTR;

void SetBob(PCWSTR* bob)
{
    *bob = L"Done";
}

int main(int argc, _TCHAR* argv[])
{
    PCWSTR bob = L"";
    SetBob(&bob);
}

运行时,main() 创建一个指向空字符串的 PCWSTR,并将其地址传递给 SetBob。在 SetBob 中,PCWSTR 指针现在指向一个 Done 字符串。当 SetBob 返回时,bob 的值为“Done”。

我的问题是:

  1. 在调试器中,我看到调用 SetBob 后 bob 字符串设置为 Done。但为什么这行得通?在整数示例中,我为整数分配了空间,因此我可以在该空间中存储一个值。但是,在字符串示例中,PCWSTR 只是一个指针。这里的想法是字符串常量也在内存中,所以我只是指向那个常量吗?
  2. 因为“Done”字面量在 SetBob 中,我是否必须担心尽管指向它,但“Done”的内存可能会被回收?例如,如果我创建了一个 WCHAR 缓冲区,我会将“完成”复制到缓冲区中,这样我就不会担心了。但是因为我指向函数中的文字,所以该文字是否会在函数结束后的某个时候被销毁,让 bob 出乎意料地指向任何内容?

【问题讨论】:

  • 文字可以被摧毁,但你必须先把枪对准你的脚。这需要违反“不要从 DLL 返回指针”规则。您可以通过卸载 DLL 来扣动扳机。
  • 因此,如果此代码位于我要链接的静态库中,那么我就可以了,因为该库永远不会被卸载,对吗?

标签: c++ string pointers wchar lpcwstr


【解决方案1】:
  1. 对于问题 1,您只需给自己正确答案即可。

  2. 1234563 bob 指向字符串地址的指针。所以在这一步中,属于字符串的内存被标记为“已使用”,所以即使到了函数的末尾,也永远不会被销毁。只有当你使用“免费”时,它才会永远留在你的记忆中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2023-03-11
    • 1970-01-01
    • 2020-10-08
    • 2017-09-11
    相关资源
    最近更新 更多