在 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 12 时很好)。自从我在项目属性中设置_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?

visual studio 2015 怎么更新

Intel parallel studio 2017 集成在visual studio 2013 中,现在如何集成到visual studio 2015

在 Visual Studio 2013-2015 中制作 requireJS 智能感知