Ошибка присвоения 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 и которое они исправили в позднее исправление.