在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更新到最新版本,但问题仍未解决。是否有一些隐藏的补丁我需要去某个地方?我无法在任何地方找到这个问题,因此我也无法找到有关该补丁的信息。
答案 0 :(得分:1)
此代码具有未定义的行为。 [iterator.requirements.general] / P6:
迭代器也可以具有与之无关的奇异值 任何序列。 [示例:声明未初始化后 指针
x
(与int* x;
一样),x
必须始终假设为 指针的奇异值。 - 结束示例]大部分结果 对于奇异值,表达式是未定义的;唯一的例外是 破坏一个包含奇异值的迭代器,赋值 包含奇异值的迭代器的非奇异值,以及 对于满足DefaultConstructible
要求的迭代器, 使用值初始化的迭代器作为副本或移动的源 操作。 [注意:默认情况下不提供此保证 初始化,虽然区别只对类型有影响 普通的默认构造函数,如指针或聚合控件 指针。 - 结束音符]在这些情况下,奇异值是 以与任何其他值相同的方式覆盖。可解除引用的值 总是非单数的。
uninitialized
是单数形式,其使用不属于该段落中列出的任何例外情况。
但是,考虑到你发布的片段,我怀疑即使你初始化uninitialized
,你的代码也无法正常工作,这是微软实施中的一个错误,并且它们修复了{{3 }}