Назначение по умолчанию построено vector<int*>::const_iterator
ошибки в Visual Studio 2010. Я пробовал это на 5 системах Visual Studio 2010, все из которых имеют пакет обновления 1. Он дает сбой на 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;
}
Ясно все, кроме cout << "Hello World" << endl;
оптимизирован в выпуске, так что этот минимальный пример потерпит неудачу только в отладке. Но в 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, но проблема не была решена. Есть ли какой-то скрытый патч, который мне нужно куда-нибудь найти? Я не могу найти нигде эту проблему, поэтому я также не могу найти информацию о патче.
Этот код имеет неопределенное поведение. [Iterator.requirements.general] / р6:
Итераторы также могут иметь особые значения, которые не связаны с
любая последовательность. [ пример: После объявления неинициализированного
указательx
(как сint* x;
),x
всегда следует предполагать иметь
единственное значение указателя. —конец примера ] Результаты большинства
выражения не определены для единичных значений; единственные исключения
уничтожение итератора, который содержит единственное значение, присваивание
неособое значение для итератора, который содержит единственное значение, и,
для итераторов, которые удовлетворяютDefaultConstructible
требования,
используя инициализированный значением итератор в качестве источника копии или перемещения
операция. [ Заметка: Эта гарантия не предоставляется по умолчанию
инициализация, хотя различие имеет значение только для типов с
тривиальные конструкторы по умолчанию, такие как указатели или агрегаты, содержащие
указатели. —конечная нота ] В этих случаях единственное значение
перезаписывается так же, как и любое другое значение. Отменяемые значения
всегда не единственного числа.
uninitialized
является единственным, и его использование не подпадает ни под одно из исключений, перечисленных в параграфе.
Однако, учитывая фрагменты, которые вы публикуете, я подозреваю, что ваш код не будет работать, даже если вы инициализируете значение uninitialized
, которая является ошибкой в реализации Microsoft, и которую они исправили в позже исправление.
Других решений пока нет …