std :: wstring指针赋值C ++

时间:2013-11-26 20:12:45

标签: 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* myString = &temp;

3 个答案:

答案 0 :(得分:7)

在第一个示例中,您将获得临时地址。在该行执行之后,您分配给wstring的{​​{1}}对象不再可用(顺便说一下,这些被称为myString。我认为很明显,在第二个例子中你有一个真实的对象(rvalue只要它没有运行范围就有效。

要使用范围克服此限制,您可以直接在堆上创建lvalue,这可能更适合您的情况,但没有进一步的信息,这很难说:

wstring

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

使用C ++ 11时,事情变得复杂,因此出于性能原因,临时工具可以更频繁地重复使用。但是这个话题非常多,而且会超出这个问题。我只是想提一下,因为它可能会让你感到厌烦。要获得一个非常好的解释,请看一下这个问题:What are move semantics?

答案 1 :(得分:1)

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;

它指向一个临时对象,但是生命时间更长,并且在该临时对象存在时取消它是有效的。

答案 2 :(得分:0)

当然,您无法将字符串常量的地址(& is& is)分配给变量。你有没有想过这个?指针指向哪里?