为什么将 std::string 传递给 CString.Format() 有时只会崩溃?

Why does passing a std::string to CString.Format() only crash sometimes?

使用 CString.Format(),当给定 int.

时,我将 std::map 传递给 returns std::string

所以:

CString cStr;
cStr.Format("%s", IntToStdStringMap[1]);

其中 IntToStdStringMap[1] returns 一些字符串,我们会说 "Hello, World!"。问题是这似乎并不是每次都崩溃。最终,我会收到访问冲突。

为什么会这样?

请记住,将代码更改为以下内容:

CString cStr;
cStr.Format("%s", IntToStdStringMap[1].c_str());

缓解了这个问题。

有什么想法吗?

std::string 传递给 CString::Format 是不正确的。来自 https://msdn.microsoft.com/en-us/library/aa314327(v=vs.60).aspx:

The format has the same form and function as the format argument for the printf function.

也就是说,当格式说明符是%s时,期望的参数类型是char const*,而不是std::string

因此,使用

cStr.Format("%s", IntToStdStringMap[1]);

是未定义行为的原因,而

的行为
cStr.Format("%s", IntToStdStringMap[1].c_str());

定义明确。