2012-10-08 111 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