2012-10-08 115 views
0

我有一個CEdit,我想用這個提取數據。C++丟失變量

wchar_t *temp = (wchar_t*)dialog.editbox.GetBuffer(0); 
dialog.editbox.ReleaseBuffer(); 

現在我要救這個文本的對象指針這樣的:

selectedShape->setText(temp); 

這項工作完美,但唯一的,只要你是在方法的範圍,因爲當我做稍後保存一個文件,該文本不再在該對象中。

有沒有人知道我可以在以後如何保存這個wchar_t*

+1

Quantify的「供以後使用。」 –

+0

另一種方法。 selectedShape是一個在整個應用程序中使用的指針。 – HansElsen

+3

該文檔說:「[使用'ReleaseBuffer'來結束'GetBuffer'分配的緩衝區的使用。](http://msdn.microsoft.com/en-us/library/aa300574(v = vs.60))。 ASPX)。」釋放後您正在使用緩衝區。如果您想保持緩衝區有效,請不要釋放您的唯一副本。 –

回答

1

temp指針指向超出範圍的數據,因此您需要動態分配內存來存儲該值。像這樣的東西應該工作:

// Updated to use wstring, thanks praetorian 
std::wstring tempStr((wchar_t*)dialog.editbox.GetBuffer(0)); 

或者:

int length = /*figure out the length here*/; 
wchar_t *temp = new wchar_t[length]; 
memcpy(temp, dialog.editbox.GetBuffer(0), length*sizeof(wchar_t)); 
// dont forget to delete it like this: delete [] temp; 
+0

'std :: string'來保存'wchar_t'緩衝區?試試'std :: wstring' – Praetorian

+0

嗨,感謝您的評論。這是一個學校項目,我有義務只使用char *和wchar_t *。編輯:哦,我看到你的編輯。現在試試吧 – HansElsen

+0

@HansElsen他們*在學校教授MFC? O noes。 Bjarne Stroustrup最近在一次演講中感嘆道他會去哪兒,他們沒有更新他們的課程[Turbo C++](http://en.wikipedia.org/wiki/Turbo_C%2B%2B)......但是這可能更加誤導了! – HostileFork

2

正如@禁衛軍說,你的代碼似乎缺少在那裏你用CString類,它的緩衝你得到工作的步驟。

http://msdn.microsoft.com/en-us/library/aa314880(v=vs.60).aspx

如果可能的話,儘量避免使用動態內存解決方案。相反,按值傳遞temp作爲一個CString對象來管理自己的內存。股票窗口setText功能採取字符串指針(CString可以隱式轉換爲)並將複製底層的字符串數據。如果您編寫自己的對象,請按值將CString對象保存爲成員。

(我會在這裏「之稱的90年代,他們希望自己的構架回復」我平時的免責聲明。Try Qt

+0

+1的答案,另一個+1的評論關於90年代和他們的框架,另一個+1建議Qt! :) – Brady

+1

不是那些+ 1/3rds? :)不要嘗試做小的原始指針算術,如你可以......任何你看到'memcpy'你使用C風格的技術,而不是C++。有新的東西正在使它更有效率; C++ 11甚至可以通過價值返回一個巨大的數據結構,並知道「移動」它而不是「複製」它。我建議花點時間閱讀這篇簡短的文章:http://www.stroustrup.com/new_learning.pdf – HostileFork