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

时间:2017-07-03 16:38:18

标签: c++ c++11 c-strings stdstring

使用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());

缓解了这个问题。

有什么想法吗?

1 个答案:

答案 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());

定义明确。