RELEASE上的bug但不是DEBUG上的bug

Gui*_*e07 1 c++ visual-studio-2010

std::string s("foo");
sprintf(buf,"%s",s);
Run Code Online (Sandbox Code Playgroud)

为什么至少在MSVC 2010下这行代码在DEBUG中没有错误,但在RELEASE中有错误?

And*_*bel 9

该%s格式说明期望一个NULL终止char*.你正在传递一个std::string实例.如果它在DEBUG中有效,那只是纯粹的运气.

你应该使用:

std::string s("foo");
sprintf(buf, "%s", s.c_str());
Run Code Online (Sandbox Code Playgroud)

这将提取char*并确保缓冲区以NULL结尾.

运行时库中可能std::string有不同的DEBUG和RELEASE实现.尝试使用这两种设置进行编译,但是将调试符号添加到RELEASE构建中,然后逐步执行代码.查看存储的内存位置s.有什么区别吗?