4

我有一个关于字符串的问题,或者特别是关于字符串使用的内存的问题。我正在使用 MSVC2010。考虑这段代码:

void Test() {
    LPWCSTR String = L"Testing";
    PrintString(String);
}

void PrintString(LPWCSTR String) {
    // print String to console or similar
}

以这种方式创建和使用字符串是否安全?当字符串超出范围时,分配用于存储字符串的内存是否被释放?

4

5 回答 5

7

是的,它是安全的,但实际上没有分配;)

L“测试”将保存在您的 exe 文件的只读部分中(作为一组常量字符)。LPWCSTR String 只是一个指向它的指针,它不需要被销毁/释放

于 2013-09-10T17:06:12.533 回答
2

我假设这LPWCSTR是错字LPCWSTR; 一个怪异的 Microsoft 名称,用于指向 C 样式字符串的指针。它代表“指向常量宽字符串的长指针”,是一种混淆的书写方式const wchar_t*

以这种方式创建和使用字符串是否安全?

像任何指针一样,只要它指向一个有效的数组,它就可以安全使用。在这种情况下,它指向一个字符串字面量,它是一个与程序一样有生命周期的数组。所以这种用法是安全的。

如果它指向一个可能在指针仍在使用时被破坏的数组,那么它就不安全了。

当字符串超出范围时,分配用于存储字符串的内存是否被释放?

不; 指针不会为您管理内存。如果您需要这样做,请使用std::wstring.

于 2013-09-10T17:06:59.757 回答
1

是的,以这种方式使用字符串是安全的。“测试”将存储在二进制文件的数据段中,字符串将被初始化为指向它。

于 2013-09-10T17:06:22.447 回答
0

L"Testing"是一个宽字符串文字并具有静态存储持续时间,这意味着它的生命周期就是程序的生命周期,您不必担心释放它。字符串文字11段中的C++ 草案标准说(强调我的):2.14.5

以 L 开头的字符串文字,例如 L"asdf",是宽字符串文字。宽字符串文字的类型为“array of n const wchar_t”,其中 n 是字符串的大小,定义如下;它具有 静态存储持续时间并使用给定字符进行初始化。

于 2013-09-10T17:07:32.560 回答
0

是的,它是安全的。

该对象是一个字符串文字。这意味着它具有程序的生命周期。

于 2013-09-10T17:08:15.120 回答