2013-11-26 90 views
1

我想分配一个值到一个wstring指针和值不分配;但是,当我将指针的创建和分配分成两行时,它就可以工作。为什么是这样?std :: wstring指针分配C++

例如:

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; 
+1

究竟“不起作用”是什么意思? – John

+0

很难说出你想要完成什么。什么'myString'指向超出范围,它不再有效。 – crashmstr

回答

7

在第一个示例中,您将获得临时地址。在该行执行了wstring对象后,您指定的myString不再可用(顺便提一下,这些对象被称为rvalue)。我认为这应该是显而易见的是,在第二个例子中,你有一个真正的对象(lvalue因为它并不运行范围OT一样长有效。

为了克服这个限制与范围,你可以直接创建一个wstring堆,这可能会更好地适合您的情况,但没有进一步的信息,这是很难说:

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

新创建wstring将我初始化临时右值的内容 只是不要忘了销毁指针。在完成之后。

随着C++的发展,11件事情变得复杂起来,因此出于性能原因,临时对象可以更频繁地重用。但是,这个话题非常多,而且会超过这个问题。我只是想提一下它,因为它可能会使你感到满意。对于一个真正伟大的解释看一看这太问题:What are move semantics?

+0

仅供参考C++ 0x死了,称为C++ 11。 – John

+0

这是否成为一个火焰战争?如果是这样的话... – Paranaix

0

当然你也可以不指定ADRESS(这是&是什么)字符串常量到一个变量。你有没有想过?指针指向哪里?

+0

你有没有想过你的答案?将字符串文字的地址赋给指针变量有什么问题?指针将指向字符串文字所在的任何内存位置。 – Praetorian

+0

@Praetorian:临时的东西消失之后会在哪里? – John

+0

一个可能(但不是必需的!)无效的内存位置,但仍然是一个内存位置。 – Paranaix

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; 

它指向一个临时对象,但生命期较长,并且在临时对象存在时取消它的有效性。

+0

你的回答很好,但我接受了上面的答案,因为Paranaix给出了类似的答案,并且指出我需要更多的研究。谢谢! – user3038090