【问题标题】:C++ loss of variablesC++ 变量丢失
【发布时间】:2023-03-21 20:25:01
【问题描述】:

我有一个 CEdit,我想用它来提取数据。

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

现在我想将此文本保存在这样的对象指针中:

selectedShape->setText(temp);

这项工作完美,但只要你在方法的范围内,因为当我稍后保存文件时,文本不再在对象中了。

有人知道我如何保存这个wchar_t* 供以后使用吗?

【问题讨论】:

  • 另一种方法。 selectedShape 是一个在整个应用程序中使用的指针。
  • 文档说“Use ReleaseBuffer to end use of a buffer allocated by GetBuffer.”。您在释放缓冲区后正在使用它。如果您想保持缓冲区有效,请不要释放您唯一的副本。
  • editbox 是 CEdit 控件吗? CEdit 没有GetBuffer 和ReleaseBuffer 成员函数。

标签: c++ pointers mfc scope


【解决方案1】:

正如@Prætorian 所说,您的代码似乎缺少使用CString 类的步骤,您正在获取其缓冲区。

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

如果可能,请避免使用动态内存解决方案。相反,将您的temp 作为一个 CString 对象按值传递,该对象将管理自己的内存。 stock Window setText 函数采用字符串指针(CString 可以隐式转换为)并将复制底层字符串数据。如果您编写自己的对象,请按值将 CString 对象作为成员。

(我将在此处添加我惯用的“90 年代被称为,他们想要他们的框架回来”的免责声明。Try Qt。)

【讨论】:

  • +1 表示答案,另一个 +1 表示关于 90 年代及其框架的评论,另一个 +1 表示建议 Qt! :)
  • 那不是+1/3rds吗? :) 尽量少做原始指针算术,并且尽可能...在任何你看到memcpy 的地方,你使用的是 C 风格的技术,而不是 C++。有一些新的东西正在使它更有效率; C++11 甚至可以按值返回一个巨大的数据结构,并且知道“移动”它而不是“复制”它。我建议花点时间阅读这篇短文:stroustrup.com/new_learning.pdf
【解决方案2】:

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;

【讨论】:

  • std::string 保存wchar_t 缓冲区?试试std::wstring
  • 您好,感谢您的评论。这是一个学校项目,我有义务只使用 char* 和 wchar_t*。编辑:哦,我看到了你的编辑。马上试用
  • @HansElsen 他们在学校教 MFC?哦不。 Bjarne Stroustrup 最近在一次演讲中感叹他会去一些地方,而他们除了Turbo C++ 之外还没有更新他们的课程……但这可能更加误导!
  • 我尝试了您的解决方案。感谢上帝,它保存了我的变量,但它没有正确的值。它在 memcpy 上搞砸了。 temp 现在包含:L"te췍췍﷽﷽
  • @HansElsen 可能是因为您只复制了一半的字符串。 memcpy 需要字节大小,而不是字符数。使用memcpy(temp, dialog.editbox.GetBuffer(0), length*sizeof(wchar_t));。此外,由于您正在处理字符串,因此建议在复制后分配length + 1 和 NULL 终止字符串。
猜你喜欢
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 2015-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多