C++ Visual Studio常量迭代器分配错误

C++ Visual Studio常量迭代器分配错误,c++,visual-studio,visual-studio-2010,iterator,initialization,C++,Visual Studio,Visual Studio 2010,Iterator,Initialization,Visual Studio 2010上默认构造的vector::const_迭代器的赋值。我已经在5个VisualStudio2010系统上试用过,这些系统都有ServicePack1。它在3/5台机器上出现故障,我已经能够确定导致3个系统出现故障的原因,但我似乎找不到错误报告 代码如下: #include <iostream> #include <vector> using namespace std; int main() { vector<int*

Visual Studio 2010上默认构造的
vector::const_迭代器的赋值。我已经在5个VisualStudio2010系统上试用过,这些系统都有ServicePack1。它在3/5台机器上出现故障,我已经能够确定导致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;
}
工作守则规定:

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更新到最新版本,但问题尚未解决。有什么隐藏的补丁需要我去哪里找吗?我在任何地方都找不到编写的此问题,因此也找不到有关修补程序的信息。

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

迭代器还可以具有与 任何序列。[示例:在声明未初始化的 指针
x
(与
int*x;
)一样,
x
必须始终假定具有 指针的奇异值。-结束示例]most的结果 表达式对于奇异值没有定义;唯一的例外是 销毁包含奇异值的迭代器时 将非奇异值传递给保存奇异值的迭代器,以及, 对于满足
DefaultConstructible
要求的迭代器, 使用值初始化迭代器作为复制或移动的源 活动[注:本保函不适用于违约情况 初始化,尽管区别仅对具有 普通的默认构造函数,如指针或聚集 指针。-结束注释]在这些情况下,奇异值为 以与任何其他值相同的方式覆盖。可解引用值 它们总是非单数的

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


然而,考虑到您发布的代码片段,我怀疑您的代码也不会工作,即使您将initialize
值设置为uninitialized
,这是Microsoft实现中的一个错误,并且他们在一个

@JamesAdkison中修复了它,您显然是这样做的。统一化迭代器并没有什么错,只要它不被取消引用。至于原因,很容易看出当迭代器是某些对象的成员,并且一个对象(以某种方式初始化)被分配给另一个对象(以某种方式初始化),而另一个对象没有被分配时会发生这种情况。@JamesAdkison,我不是OP,所以我不确定他想做什么。但是,从表面上看(我没有办法验证),提供的代码不应该使程序崩溃。如果是这样的话,那就是一个糟糕的实现错误。我想知道这在现实生活中什么时候会发生,因为很明显,发布的代码是演示性的。我不知道你说的“混合”是什么意思。当然,您不应该比较这些迭代器。但把它们分配给对方并没有什么错。我相当肯定这在技术上是正确的<代码>未初始化
是单数,[iterator.requirements.general]/p6明确指出“对于奇异值,大多数表达式的结果未定义;唯一的例外是销毁保存奇异值的迭代器,将非奇异值赋值给保存奇异值的迭代器,对于满足
DefaultConstructible
要求的迭代器,使用值初始化迭代器作为复制或移动操作的源。“这似乎是@JonathanMee,单数值与任何序列都没有关联。例如,空指针或未初始化指针。顺便说一句,您链接的页面只是知识库文章。可在此处请求下载链接:
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();
    }