我偶然发现了在Visual Studio 2015中以DEBUG模式编译的问题,我在下面的代码中遇到了访问冲突错误(在发布模式下还是_ITERATOR_DEBUG_LEVEL 1
或2
) 。问题只是浮出水面,因为我在项目属性中设置了_ITERATOR_DEBUG_LEVEL=0
(为了简单起见,我在这里添加了#define
,这也导致了错误):
#define _ITERATOR_DEBUG_LEVEL 0
#include <iostream>
#include <string>
#include <sstream>
bool try_parse(const std::string& s, double& v)
{
std::stringstream stream;
std::locale invariant_number_locale{ std::locale{ "" }, new std::numpunct<char>() };
stream.imbue(invariant_number_locale);
stream << s;
stream >> v;
return !stream.fail();
}
int main()
{
double v;
std::string s = "123";
try_parse(s, v);
std::cout << "d = " << v << std::endl;
std::cout << "Done...";
std::getchar();
return EXIT_SUCCESS;
}
问题似乎在stream.imbue(invariant_number_locale);
行。
答案 0 :(得分:2)
似乎答案是如果你使用facet,你必须在调试模式下使用_ITERATOR_DEBUG_LEVEL=2
按照这个线程:
https://connect.microsoft.com/VisualStudio/feedback/details/2655363
感谢@HansPassant指出我正确的方向。