我们正在将旧的 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
}
Run Code Online (Sandbox Code Playgroud)
在VS2010中,mystr_out(“hello”)的值被正确分配给mystr_in1。然而在VS2017中,垃圾数据被分配给mystr_in1。我在 StackOverflow 中读到类似的问题,在这种情况下执行 ZeroMemory …