临时字符串的内存分配

时间:2013-09-10 17:01:56

标签: c++ memory-management

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

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

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

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

5 个答案:

答案 0 :(得分:7)

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

L“Testing”将保存在exe文件的只读部分(作为一组常量字符)。 LPWCSTR String只是指向它的指针,不需要销毁/取消分配

答案 1 :(得分:2)

我会假设LPWCSTRLPCWSTR的拼写错误;指向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)

是的,这是安全的。

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