C++ wmemcpy&;导致崩溃的wcscpy函数

C++ wmemcpy&;导致崩溃的wcscpy函数,c++,winapi,memory,copy,cstring,C++,Winapi,Memory,Copy,Cstring,我正在尝试将一个宽c字串从一个地方复制到另一个地方。我正在windows8 64位平台上使用Visual Studio 2012 express。除非我尝试使用Windows7 x64在我的主计算机上运行应用程序,否则它工作得非常好。它立即崩溃。没有异常错误,尽管这是一个混乱的崩溃,没有任何可跟踪的错误代码。如果您需要关于崩溃本身的更具体的信息,我会尽力提供。当我注释掉复制程序时,程序运行得非常好。很明显,问题在于函数本身。以下是执行所有复制操作的行: virtual void CClass::

我正在尝试将一个宽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());
}
virtualvoid类::ChangeText();
void CClass::ChangeText(float\u f)
{
std::wstringstream wss;
wss m_lpszWideText),wss.str().c_str();
}
^在win7上崩溃/在win8上工作


我的猜测是,新的编译器使用了一个更新版本的wmemcpy,它不能在Windows7上工作?但是,程序不是只有在到达函数调用行时才会崩溃吗?

使用字符串复制算法的崩溃通常有两个原因:

  • 您的源不是以NULL结尾的 在您的示例中,情况并非如此,因为您是从wstringstream::c_str()提取它的

  • 您的目的地不够大,无法处理源数据,因此写得超出范围。 这可能是您崩溃的原因,也就是说,您的This->m_lpszWideText太小(请给出它的声明,如果它是动态分配的,请告诉我们如何分配。)


  • m_lpszWideText
    是如何定义的?它是我自己的(文本组件)类的成员指针:
    private:const wchar\u t*m_lpszWideText如何为其分配内存?当它需要修改时,为什么它是常量?为什么不直接使用
    std::wstring
    ?实际上这不是个坏主意。。哎呀。我一直被教导,不管发生什么,c字符串都是一个“const char*”。我仍然不确定它是指向char数组的常量指针还是指向const chars rofl数组的指针。不可能,否则它会在每个平台上崩溃。现在它是一个
    wchar_\t WideText[150],我最初通过wcscpy()给它赋值。它仍然在另一台计算机上崩溃,在win8上运行良好…我通过函数ChangeText为它指定了一个值100,我在上一篇文章中为它粘贴了代码。也许win8有另一个内存管理,而不是Win7,这意味着,你可以从内存中写入,而不必写入受保护的区域,在win7中,您可以在该区域外进行书写。这可能是64/32位的问题吗?在复制之前检查要复制的字符串的大小,如果合适的话?这很有可能。这种情况的解决方案:除了需要提取和传递c-string->use wstringstream::c_str()的时刻之外,请坚持使用wstring。