Ошибка присвоения Visual Studio const_iterator

Назначение построенных по умолчанию ошибок vector<int*>::const_iterator в Visual Studio 2010. Я пробовал это на 5 системах Visual Studio 2010, у которых есть Service Pack 1. Он не работает на 3/5 машинах, я смог определить, что вызывает отказ в трех системах, но я не могу найти отчет об ошибке.

Вот код:

#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 возникает ошибка:

Необработанное исключение в 0x01071e14 в файле test.exe: 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, но проблема не была решена. Есть ли скрытый патч, который мне нужно пойти куда-нибудь, чтобы добраться? Я не могу найти эту проблему в любом месте, поэтому я также не могу найти информацию о патче.

Ответы

Ответ 1

Этот код имеет поведение undefined. [Iterator.requirements.general]/р6:

Итераторы могут также иметь особые значения, которые не связаны с любая последовательность. [Пример: после объявления неинициализированного указатель x (как и в случае с int* x;), x всегда должен иметь сингулярное значение указателя. -end example] Результаты большинства выражения undefined для сингулярных значений; единственными исключениями являются уничтожая итератор, который имеет сингулярное значение, назначение неособое значение для итератора, который имеет сингулярное значение, и, для итераторов, удовлетворяющих требованиям DefaultConstructibleиспользуя инициализируемый значением итератор в качестве источника копии или перемещения операция. [Примечание: эта гарантия не предоставляется для дефолта инициализации, хотя различие имеет значение только для типов с тривиальные конструкторы по умолчанию, такие как указатели или агрегаты, содержащие указатели. -end note] В этих случаях сингулярное значение перезаписывается так же, как и любое другое значение. Вызываемые значения всегда неособы.

uninitialized является единственным, и его использование не подпадает ни к одному из исключений, перечисленных в параграфе.

Однако, учитывая опубликованные фрагменты, я подозреваю, что ваш код не будет работать, даже если вы value-initialize uninitialized, что является ошибкой в ​​реализации Microsoft и которое они исправили в позднее исправление.