使用CString.Format()
,我传给std::map
,在给定std::string
时返回int
。
所以:
CString cStr;
cStr.Format("%s", IntToStdStringMap[1]);
其中IntToStdStringMap[1]
返回一些字符串,我们会说“Hello,World!”。问题是每次都不会崩溃。最终,我将收到访问冲突。
为什么会这样?
请注意,将代码更改为以下内容:
CString cStr;
cStr.Format("%s", IntToStdStringMap[1].c_str());
缓解了这个问题。
有什么想法吗?
答案 0 :(得分:5)
将std::string
传递给CString::Format
是不对的。来自https://msdn.microsoft.com/en-us/library/aa314327(v=vs.60).aspx:
格式与printf函数的format参数具有相同的形式和功能。
这意味着,当格式说明符为%s
时,预期的参数类型为char const*
,而不是std::string
。
因此,使用
cStr.Format("%s", IntToStdStringMap[1]);
是
行为导致未定义行为的原因cStr.Format("%s", IntToStdStringMap[1].c_str());
定义明确。