为什么将 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());
定义明确。
使用 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());
定义明确。