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

Fra*_*ani 1 c++ c-strings stdstring c++11

使用CString.Format(),我传给它一个std::map返回std::string给定的时候int.

所以:

CString cStr;
cStr.Format("%s", IntToStdStringMap[1]);
Run Code Online (Sandbox Code Playgroud)

其中,IntToStdStringMap[1]返回一些字符串,我们会说"你好,世界!".问题是每次都不会崩溃.最终,我将收到访问冲突.

为什么会这样?

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

CString cStr;
cStr.Format("%s", IntToStdStringMap[1].c_str());
Run Code Online (Sandbox Code Playgroud)

缓解了这个问题.

有任何想法吗?

R S*_*ahu 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]);
Run Code Online (Sandbox Code Playgroud)

是行为的原因未定义的行为

cStr.Format("%s", IntToStdStringMap[1].c_str());
Run Code Online (Sandbox Code Playgroud)

很明确.