Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::wstring指针赋值C++;_C++_Pointers_Wstring - Fatal编程技术网

C++ std::wstring指针赋值C++;

C++ std::wstring指针赋值C++;,c++,pointers,wstring,C++,Pointers,Wstring,我试图给wstring指针赋值,但没有赋值;但是,当我将指针的创建和赋值分为两行时,它就起作用了。为什么会这样 例如: std::wstring* myString = &(L"my basic sentence" + some_wstring_var + L"\r\n"); 上述方法无效,但以下方法有效: std::wstring temp = (L"my basic sentence" + some_wstring_var + L"\r\n"); std::wstring* myS

我试图给wstring指针赋值,但没有赋值;但是,当我将指针的创建和赋值分为两行时,它就起作用了。为什么会这样

例如:

std::wstring* myString = &(L"my basic sentence" + some_wstring_var + L"\r\n");
上述方法无效,但以下方法有效:

std::wstring temp = (L"my basic sentence" + some_wstring_var + L"\r\n");
std::wstring* myString = &temp;

当然,不能将字符串常量的地址(即&is)分配给变量。你考虑过了吗?指针指向何处?

在第一个示例中,您得到的是临时地址。在该行执行后,您分配给
myString
wstring
对象不再可用(顺便说一下,这些被称为
rvalue
s)。我认为在第二个例子中,应该很明显,你有一个真实的对象(a
lvalue
),只要它不超出范围,它就是有效的

为了克服这个范围限制,您可以直接在堆上创建一个
wstring
,这可能更适合您的情况,但如果没有进一步的信息,这很难判断:

std::wstring* myString = new std::wstring(L"my basic sentence" + some_wstring_var + L"\r\n");
新创建的
wstring
将使用临时右值的内容初始化。 只是不要忘记在使用完指针后销毁它

使用C++11时,事情变得复杂,因此出于性能原因,可以更频繁地重用临时变量。但是,这个主题非常重要,并且将超过这个问题。我只想提及它,因为它可能也会让您感兴趣。要获得非常好的解释,请查看这个非常重要的问题:

它指向一个临时对象,其生命周期以分号结束,因此取消引用指针并使用它是未定义的行为


它指向一个临时对象,但生命周期较长,并且在该临时对象存在时对其进行反引用是有效的。

您是否考虑过您的答案?将字符串文本的地址分配给指针变量有什么问题?指针将指向字符串文本所在的任何内存位置。@Praetorian:和在临时对象消失后,它会在哪里?一个可能(但不是必需的!)无效的内存位置,但仍然是一个内存位置。您没有提到任何临时对象。我引用“您无法将字符串常量的地址…分配给变量”供参考C++0x已失效,称为C++11。究竟什么“不起作用”意思是?很难说你想要完成什么。当
myString
指向的内容超出范围时,它就不再有效了。你的答案很好,但我接受了上面的答案,因为Paranix给出了类似的答案,也为我指出了更多的研究方向。谢谢!
std::wstring* myString = &(L"my basic sentence" + some_wstring_var + L"\r\n");
std::wstring temp = (L"my basic sentence" + some_wstring_var + L"\r\n");
std::wstring* myString = &temp;