Здраствуйте!
Подскажите пожалуйста — в каком случае метод begin() может возвращать итератор с node == NULL?
std::map<TDateTime, int> m;
// заполнение данными
// ...
//
std::map<TDateTime, int>::iterator i = m.begin();
while ( i != m.end() )
{
//
// что-то делаем
//
++i;
}
так вот при первом выполнении строки с while выпадаем по эксепшену AccessViolation. Если под дебагером посмотреть итератор перед выполнением while, то он содержит NULL. При этом в мапе порядка 12 записей!
> Подскажите пожалуйста — в каком случае метод begin() может возвращать итератор с node == NULL?
> > std::map<TDateTime, int> m;
>
> // заполнение данными
> // ...
> //
>
> std::map<TDateTime, int>::iterator i = m.begin();
> while ( i != m.end() )
> {
> //
> // что-то делаем
> //
> ++i;
> }
>
> так вот при первом выполнении строки с while выпадаем по эксепшену AccessViolation. Если под дебагером посмотреть итератор перед выполнением while, то он содержит NULL. При этом в мапе порядка 12 записей!
Такое может быть, если оператор < для класса TDateTime не удовлетворяет условию strict weak ordering. Соответствеено, выкладывайте код этого оператора.
Posted via RSDN NNTP Server 2.0
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, AlexeyV, Вы писали:
AV>Здраствуйте!
AV>Подскажите пожалуйста — в каком случае метод begin() может возвращать итератор с node == NULL?
AV>
AV>std::map<TDateTime, int>::iterator i = m.begin();
ну например если здесь другой поток твой мап поиспользовал как-то
AV>while ( i != m.end() )
AV>{
AV>}
AV>
AV>так вот при первом выполнении строки с while выпадаем по эксепшену AccessViolation. Если под дебагером посмотреть итератор перед выполнением while, то он содержит NULL. При этом в мапе порядка 12 записей!... << RSDN@Home 1.2.0 alpha rev. 0>>
Здравствуйте, Sergey, Вы писали:
S>Такое может быть, если оператор < для класса TDateTime не удовлетворяет условию strict weak ordering. Соответствеено, выкладывайте код этого оператора.
TDateTime — это класс C++ Builder-а для представления даты-времени:
class RTL_DELPHIRETURN TDateTimeBase
{
public:
double Val;
};
class RTL_DELPHIRETURN TDateTime : public TDateTimeBase
{
public:
// множество методов
bool __fastcall operator <(const TDateTime& rhs) const
{return Val < rhs.Val;}
};
AlexeyV пишет:
> ...
> так вот при первом выполнении строки с while выпадаем по эксепшену
> AccessViolation. Если под дебагером посмотреть итератор перед
> выполнением while, то он содержит NULL.
У тебя ошибка в другом месте кода
Posted via RSDN NNTP Server 2.0