Visual Studio const_iterator Ошибка назначения

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

2

Решение

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

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

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]