我有关于字符串的问题,或者特别是关于字符串使用的内存的问题。我正在使用MSVC2010。考虑一下这段代码:
void Test() {
LPWCSTR String = L"Testing";
PrintString(String);
}
void PrintString(LPWCSTR String) {
// print String to console or similar
}
以这种方式创建和使用字符串是否安全?当字符串超出范围时,为字符串的存储分配的内存是否被释放?
答案 0 :(得分:7)
是的,它是安全的,但实际上没有分配;)
L“Testing”将保存在exe文件的只读部分(作为一组常量字符)。 LPWCSTR String只是指向它的指针,不需要销毁/取消分配
答案 1 :(得分:2)
我会假设LPWCSTR
是LPCWSTR
的拼写错误;指向C风格字符串的指针的怪异Microsoft名称。它代表“指向常量宽字符串的长指针”,是一种混淆的写const wchar_t*
的方式。
以这种方式创建和使用字符串是否安全?
与任何指针一样,只要指向有效数组,就可以安全使用。在这种情况下,它指向一个字符串文字,这是一个与程序一样长寿的数组。所以这种用法是安全的。
如果它指向一个在指针仍在使用时可能被销毁的数组,那么它就不安全了。
当字符串超出范围时,为字符串存储分配的内存是否被释放?
没有;指针不会为您管理内存。如果您需要这样做,请使用std::wstring
。
答案 2 :(得分:1)
是的,以这种方式使用字符串是安全的。 “Testing”将存储在二进制文件的数据段中,String将被初始化为指向它。
答案 3 :(得分:0)
L"Testing"
是一个宽字符串文字,具有静态存储持续时间,这意味着它的生命周期是程序的生命周期,您不必担心解除分配它。 2.14.5
字符串文字段 11 中的C++ draft standard表示(强调我的):
以L开头的字符串文字,例如L“asdf”,是一个广泛的字符串文字 字符串文字。宽字符串文字的类型为“const of n const” wchar_t“,其中n是下面定义的字符串的大小;它有 静态存储时间并使用给定的字符进行初始化。
答案 4 :(得分:0)
是的,这是安全的。
该对象是一个字符串文字。这意味着它具有程序的生命周期。