【发布时间】:2017-03-10 09:43:52
【问题描述】:
我偶然发现了在 Visual Studio 2015 中的调试模式下编译时出现的问题,在该问题中我收到以下代码的访问冲突错误(在发布模式下或者 _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);这一行。
【问题讨论】:
-
我不确定这是一个最小的例子。尝试逐行注释(从
try_parse中的流操作开始)并重新编译,直到它在编译时不会崩溃。 -
@Spencer,我现在已经完成了
-
std::stringstream 的模板特化内置在标准 C++ 库的调试版本 msvcp140d.dll 中。它是在启用迭代器调试的情况下构建的。卡布姆。永远不要这样做,使用小型数据集进行调试,仅使用 Release 构建测试性能。
-
@HansPassant 是否同样适用于 Visual Studio 2013?在这种情况下,覆盖
_ITERATOR_DEBUG_LEVEL的正确方法是什么? -
@HansPassant 如果我们不灌输自定义语言环境,则没有问题。这有什么关系?
标签: c++ visual-c++ visual-studio-2015