2013-11-26 83 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