【问题标题】:stringstream access violation with _ITERATOR_DEBUG_LEVEL 0 in Visual Studio 2015在 Visual Studio 2015 中使用 _ITERATOR_DEBUG_LEVEL 0 的字符串流访问冲突
【发布时间】: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 如果我们不灌输自定义语言环境,则没有问题。这有什么关系?

标签: c++ visual-c++ visual-studio-2015


【解决方案1】:

答案似乎是,如果您使用构面,则必须按照此线程在调试模式下使用_ITERATOR_DEBUG_LEVEL=2

https://connect.microsoft.com/VisualStudio/feedback/details/2655363

感谢@HansPassant 为我指明了正确的方向。

【讨论】:

    猜你喜欢
    • 2015-09-23
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    相关资源
    最近更新 更多