【问题标题】:wmemcpy & wcscpy functions causing crashes导致崩溃的 wmemcpy 和 wcscpy 函数
【发布时间】:2013-04-15 14:37:39
【问题描述】:

我正在尝试将一个宽 c 字符串从一个地方复制到另一个地方。我在 windows8 64 位平台上使用 Visual Studio 2012 express。除非我尝试在使用 Windows7 x64 的主计算机上运行该应用程序,否则它工作得非常好。它立即崩溃。没有异常错误,尽管它是一个没有任何可跟踪错误代码的混乱崩溃。如果您需要有关崩溃本身的更多具体信息,我将尝试提供。当我注释掉复制程序时,它工作得很好。所以很明显问题出在函数本身。这是完成所有复制的行:

virtual void CClass::ChangeText();
void CClass::ChangeText(float _f)
{
    std::wstringstream wss;
    wss << _f;
    wcscpy(const_cast<wchar_t *>(this->m_lpszWideText),wss.str().c_str());
}

^在win7上崩溃/在win8上工作

我的猜测是,新编译器使用了新版本的 wmemcpy,它在 Windows 7 上不起作用?程序不应该只在到达函数调用行时才崩溃吗?

【问题讨论】:

  • m_lpszWideText 是如何定义的?
  • 这是我自己的(文本组件)类的成员指针:private: const wchar_t* m_lpszWideText;
  • 如何为它分配内存?为什么需要修改时是const?为什么不直接使用std::wstring
  • 其实这不是一个坏主意..哎呀。好吧,我总是被教导 C-string 无论如何都是“const char *”。我仍然不确定它是指向 char 数组的常量指针还是指向 const chars rofl 数组的指针。

标签: c++ winapi memory copy cstring


【解决方案1】:

字符串复制算法的崩溃通常有两个来源:

  1. 您的源不是以 NULL 结尾的 在您的示例中并非如此,因为您从 wstringstream::c_str()

  2. 中提取它
  3. 您的目标不够大,无法处理源数据,因此写入超出边界。 这可能是您崩溃的原因,意味着您的 this->m_lpszWideText 太小(请给出它的声明,如果它是动态分配的,请告诉我们如何。)

【讨论】:

  • 不可能,否则它会在每个平台上崩溃。它现在是wchar_t WideText [150];,我最初通过 wcscpy() 为它分配了一个值。它仍然在另一台计算机上崩溃并在win8上正常工作......
  • 我通过我在上一篇文章中粘贴代码的函数 ChangeText 为其分配了 100 的值。
  • 也许Win8比Win7有另一个内存管理,这意味着你可以写出你的内存,而不写到一个受保护的区域,而在win7你写出的区域。可能是 64/32 位问题?在复制之前检查要复制的字符串的大小,如果合适的话?
  • 这很合理。这种情况的解决方案:除了需要提取和传递c-string的那一刻,坚持使用wstring -> 使用wstringstream::c_str()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-07
  • 2013-07-04
  • 2021-05-18
相关资源
最近更新 更多