当我在将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]...
我只是想知道造成这种奇怪行为的原因。
谢谢
答案 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;