ZeroMemory 具有 std::string 的结构并为其赋值在 VS2010 和 VS2017 中具有不同的行为

Hui Liu-MSFT 48,676 信誉分 Microsoft 外部员工
2024-02-27T09:17:55.34+00:00

我在 StackOverflow 中问了同样的问题,但我认为这可能是 Visual Studio 问题,所以我在这里问。 我们正在将一个旧的 MFC 项目从 VS2010 升级到 VS2017,当将数据分配给使用 ZeroMemory 清除的结构内的 std::string 时,我们发现了不同的行为。 我创建了一个简单的 MFC 程序来重现该问题。

std::string getStrData() {
    std::string temp = "world";
    return temp;
}
CMainFrame::CMainFrame()
{
    struct mystruct{
        std::string mystr_in1;
        std::string mystr_in2;
    };
    std::string mystr_out = "hello";
    mystruct* sttemp = new mystruct();
    ZeroMemory(sttemp, sizeof(mystruct));  // <-- we think this is bad
    sttemp->mystr_in1 = mystr_out;         // <-- VS2010: "hello" is assigned, but VS2017: garbage is assigned
    sttemp->mystr_in2 = getStrData();      // <-- VS2010 and VS2017: "world" is assigned
}

在VS2010中,mystr_out(“hello”)的值被正确分配给mystr_in1。 然而在VS2017中,垃圾数据被分配给mystr_in1。 我读到与此类似的问题,在这种情况下执行 ZeroMemory 会破坏 std::string,所以我们认为这是问题的原因。 但在 mystr_in2 中,它能够在 VS2010 和 VS2017 中正确分配“world”。 如果有人可以解释的话,我对这种行为有两个问题。 对于第一种情况(mystr_in1),为什么在VS2010和VS2017中编译的代码有不同的行为? VS2017 中是否有某种项目设置可以解决此问题? 在升级旧的VS2010项目时,我们只是在VS2017中打开VS2010解决方案并选择升级解决方案。 (我们大部分老项目只要这样做就没有问题) 对于第二种情况(mystr_in2),它应该与第一种情况相同(?),但分配给它的 std::string 是从函数返回的。 这与也分配 std::string 的第一种情况有何不同? Note:此问题总结整理于ZeroMemory a struct with std::string and assigning value to it has different behavior in VS2010 and VS2017

开发人员技术 C++
0 个注释 无注释
{count} 票

接受的答案
  1. 匿名
    2024-02-27T09:30:23.6166667+00:00

    你好,

    为什么VS2010和VS2017中编译的代码有不同的行为? VS2010中使用的sdk与VS2017中的不一样。 对于第二种情况 这是由于内存损坏造成的。

    尝试一下片段:

      sttemp->mystr_in1 = (std::string)mystr_out;
      sttemp->mystr_in2 = getStrData();
    

    如果答案是正确的,请点击“接受答案”并点赞。 如果您对此答案还有其他疑问,请点击“评论”。

    注意:如果您想接收相关电子邮件,请按照我们的文档中的步骤启用电子邮件通知 此线程的通知。

    1 个人认为此答案很有帮助。
    0 个注释 无注释

0 个其他答案

排序依据: 非常有帮助

你的答案

问题作者可以将答案标记为“接受的答案”,这有助于用户了解已解决作者问题的答案。