Visual Studio const_iterator分配错误

时间:2015-09-23 20:28:18

标签: c++ visual-studio visual-studio-2010 iterator initialization

在Visual Studio 2010上分配默认构造的vector<int*>::const_iterator错误。我已经在5个Visual Studio 2010系统上尝试了这一点,这些系统都有Service Pack 1.它在3/5计算机上失败,我&# 39;已经能够确定导致3个系统失败的原因,但我似乎无法找到错误报告。

以下是代码:

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int*> vec;
    int arr[3] = {};

    for(int i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i) vec.push_back(arr + i);

    vector<int*>::const_iterator initialized = vec.cbegin();
    vector<int*>::const_iterator uninitialized;

    initialized = uninitialized;

    cout << "Hello World" << endl;

    return 0;
}

显然,除cout << "Hello World" << endl;之外的所有内容都在Release中进行了优化,因此这个最小的示例只会在Debug中失败。但在Debug中,它给出的错误是:

  

test.exe中0x01071e14处的未处理异常:0xC0000005:访问冲突读取位置0x00000000。

比较链接的工作和非工作MSVCP100D.dll显示存在轻微差异,工作.dll是产品版本:10.0.40219.325,非工作.dll是产品版本:10.0.40219.1。

实际错误发生在

  

C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ include \ xutility

再次分析工作版和非工作版本表明已对工作版本进行了更改。非工作代码只是说:

if (_Myproxu != _Right._Myproxy)
    _Adopt(_Right._Myproxy->_Mycont);

工作代码说:

if (_Myproxy == _Right._Myproxy)
    ;
else if (_Right._Myproxy != 0)
    _Adopt(_Right._Myproxy->_Mycont);
else
    {   // becoming invalid, disown current parent
    _Lockit _Lock(_LOCK_DEBUG);
    _Orphan_me();
    }

这就是说,这是我的实际问题。我如何获得此更新?我已使用Windows Update更新到最新版本,但问题仍未解决。是否有一些隐藏的补丁我需要去某个地方?我无法在任何地方找到这个问题,因此我也无法找到有关该补丁的信息。

1 个答案:

答案 0 :(得分:1)

此代码具有未定义的行为。 [iterator.requirements.general] / P6:

  

迭代器也可以具有与之无关的奇异值   任何序列。 [示例:声明未初始化后   指针x(与int* x;一样),x必须始终假设为   指针的奇异值。 - 结束示例]大部分结果   对于奇异值,表达式是未定义的;唯一的例外是   破坏一个包含奇异值的迭代器,赋值   包含奇异值的迭代器的非奇异值,以及   对于满足DefaultConstructible要求的迭代器,   使用值初始化的迭代器作为副本或移动的源   操作。 [注意:默认情况下不提供此保证   初始化,虽然区别只对类型有影响   普通的默认构造函数,如指针或聚合控件   指针。 - 结束音符]在这些情况下,奇异值是   以与任何其他值相同的方式覆盖。可解除引用的值   总是非单数的。

uninitialized是单数形式,其使用不属于该段落中列出的任何例外情况。

但是,考虑到你发布的片段,我怀疑即使你初始化uninitialized,你的代码也无法正常工作,这是微软实施中的一个错误,并且它们修复了{{3 }}