在 Visual Studio 2015 中使用 _ITERATOR_DEBUG_LEVEL 0 的字符串流访问冲突
Posted
技术标签:
【中文标题】在 Visual Studio 2015 中使用 _ITERATOR_DEBUG_LEVEL 0 的字符串流访问冲突【英文标题】:stringstream access violation with _ITERATOR_DEBUG_LEVEL 0 in Visual Studio 2015 【发布时间】: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 如果我们不灌输自定义语言环境,则没有问题。这有什么关系?
【参考方案1】:
答案似乎是,如果您使用构面,则必须按照此线程在调试模式下使用_ITERATOR_DEBUG_LEVEL=2
:
https://connect.microsoft.com/VisualStudio/feedback/details/2655363
感谢@HansPassant 为我指明了正确的方向。
【讨论】:
以上是关于在 Visual Studio 2015 中使用 _ITERATOR_DEBUG_LEVEL 0 的字符串流访问冲突的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 2015 在 constexpr 中使用 lambda
使用平台工具集 v120 (Visual Studio 2013) 在 Visual Studio 2015 中创建 C++/CLI 项目
如何在 Visual Studio 2015 中使用 C# 7?
Intel parallel studio 2017 集成在visual studio 2013 中,现在如何集成到visual studio 2015