将std :: string转换为LPCSTR时的奇怪行为

时间:2012-07-06 22:38:06

标签: c++ string type-conversion stdstring lpcstr

当我在将std::string转换为LPCSTR时偶然发现一种奇怪的行为时,我正在玩一些字符串。

我写了一个小测试应用程序来演示:

#include <string>
#include <Windows.h>
#include <iostream>

using namespace std;

int main ()
{
    string stringTest = (string("some text") + " in addition with this other text").c_str(); 
    LPCSTR lpstrTest= stringTest.c_str();
    cout << lpcstrTest << '\n';

    cout << (string("some text") + " in addition with this other text").c_str() << '\n';

    LPCSTR otherLPCSTR= (string("some text") + " in addition with this other text").c_str();
    cout << otherLPSTR;
}

这是输出:

some text in addition with this other text
some text in addition with this other text
îþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþîþ...[more unreadable stuff]...

我只是想知道造成这种奇怪行为的原因。

谢谢

3 个答案:

答案 0 :(得分:2)

LPCSTR otherLPCSTR= (string("some text") + " in addition with this other text").c_str();
cout << otherLPSTR;

部分

 (string("some text") + " in addition with this other text")

创建一个所谓的“临时”对象,该对象没有名称,并在包含它的语句结束时被破坏。从中获取c_str(),它指向该临时对象的某个内部存储。您将该c_str()分配给otherLPCSTR变量。之后,“包含临时字符串的语句”已经完成,因此临时字符串被破坏,而其他LPCSTR指向“无处”。

答案 1 :(得分:0)

表达式创建的临时对象一直存在,直到完整表达式的评估完成。评估完整表达式后,其所有临时表将自动销毁。

会发生这种情况
LPCSTR otherLPCSTR = 
  (string("some text") + " in addition with this other text").c_str();

在此声明之后,临时性被销毁,otherLPCSTR最终指向死记忆。

在第一种情况下,stringTest不是临时的。它存在main的末尾,意味着lpstrTest指针仍然有效。

在第二种情况下,临时std::string对象在它仍然存活时立即用于输出。

仅在第三种情况下,您尝试存储指针,如上所述,该指针无效。

答案 2 :(得分:0)

c_str()返回的指针只有在其字符串对象为。

时才有效
// A copy of a temporary string is made here. The temporary is destructed 
// but stringTest stays in scope until the end of main
string stringTest = (string("some text") + " in addition with this other text").c_str();

LPCSTR lpstrTest= stringTest.c_str();
cout << lpcstrTest << '\n';

// the temporary is in scope until the end of the full expression, so this is fine.

cout << (string("some text") + " in addition with this other text").c_str() << '\n';

// But this isn't. At the end of the line, the temporary string object is long gone.
// otherLPCSTR now points to deallocated memory.
LPCSTR otherLPCSTR= (string("some text") + " in addition with this other text").c_str();

// And here you're accessing that memory.
cout << otherLPSTR;