我在 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