473,289 Members | 2,141 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,289 software developers and data experts.

std::map::find() throws exception when map is empty?

Hello,

std::map< int, MyClass*> mymap;

it = mymap.find( somekey ) // here happen bad things
if( it != mymap.end() )
{
// do something useful with it->second
}
else
{
// do nothing
}

I traced a strange program crash (unhandled exception on windows,
something similar on Solaris) down to happen at the second line of
the code given above which contains the find(). After some
investigation I found out that it happens when the map is empty.

This behaviour could be reproduced on Windows 2k and XP using MSVC 6.0
and 7.0 and finally also on Solaris unsing the Sun CC 5.4.

I read the documentation as well as books and internet resources but I
could not find a single statement that on an empty map a find() must
not be performed.

Could anybody please give me some information whether this is correct
or at least well known behaviour? Did I miss something? I do not like
the idea of preceeding all "critical" find() with some statement like
if( ! mymap.empty() )...

Any comments would be appreciated! Thanks!

Matthias
Jul 19 '05 #1
4 26189
"Matthias Hildebrand" <hi********@uni-kassel.de> wrote...
std::map< int, MyClass*> mymap;

it = mymap.find( somekey ) // here happen bad things
if( it != mymap.end() )
{
// do something useful with it->second
}
else
{
// do nothing
}

I traced a strange program crash (unhandled exception on windows,
something similar on Solaris) down to happen at the second line of
the code given above which contains the find(). After some
investigation I found out that it happens when the map is empty.

This behaviour could be reproduced on Windows 2k and XP using MSVC 6.0
and 7.0 and finally also on Solaris unsing the Sun CC 5.4.

I read the documentation as well as books and internet resources but I
could not find a single statement that on an empty map a find() must
not be performed.

Could anybody please give me some information whether this is correct
or at least well known behaviour? Did I miss something? I do not like
the idea of preceeding all "critical" find() with some statement like
if( ! mymap.empty() )...


No, this is not correct. As to whether it's a known behaviour, you
have to check with those who make the library for your compiler.

Although it has no exception specification, 'find' usually does not
throw by itself. The reason there is no exception specification is
that 'find' uses the comparison function for keys, that may throw.

I understand your frustration about having to use '.empty()' before
'find', but it may be the only work-around for your particular version
of the library. Contact the library vendor and let them know about
your trouble. They should fix it.

Victor

Jul 19 '05 #2
Matthias Hildebrand wrote:

Could anybody please give me some information whether this is correct
or at least well known behaviour? Did I miss something? I do not like
the idea of preceeding all "critical" find() with some statement like
if( ! mymap.empty() )...

Any comments would be appreciated! Thanks!


What was the exception, who threw it, and why?

Jul 19 '05 #3
hi********@uni-kassel.de (Matthias Hildebrand) wrote in message news:<65**************************@posting.google. com>...
Hello,

std::map< int, MyClass*> mymap;

it = mymap.find( somekey ) // here happen bad things
if( it != mymap.end() )
{
// do something useful with it->second
}
else
{
// do nothing
}

I traced a strange program crash (unhandled exception on windows,
something similar on Solaris) down to happen at the second line of
the code given above which contains the find(). After some
investigation I found out that it happens when the map is empty.

This behaviour could be reproduced on Windows 2k and XP using MSVC 6.0
and 7.0 and finally also on Solaris unsing the Sun CC 5.4.

I read the documentation as well as books and internet resources but I
could not find a single statement that on an empty map a find() must
not be performed.

Could anybody please give me some information whether this is correct
or at least well known behaviour? Did I miss something? I do not like
the idea of preceeding all "critical" find() with some statement like
if( ! mymap.empty() )...


This is not correct. It is perfectly permissible to use find with an
empty map. The bug must be elsewhere.

Bob
Jul 19 '05 #4
Hello!
std::map< int, MyClass*> mymap;

it = mymap.find( somekey ) // here happen bad things
if( it != mymap.end() )
{
// do something useful with it->second
}
else
{
// do nothing
}

I traced a strange program crash (unhandled exception on windows,
something similar on Solaris) down to happen at the second line of
the code given above which contains the find(). After some
investigation I found out that it happens when the map is empty.
I stepped through some STL code and found out that the cause is a
simple dereferenced NULL pointer within the STL... In short and
simplified words: find is looking for a node close neighbored to the
given key, which results in a NULL pointer because the map is empty,
and then the STL wants to access the parent of this node by
dereferencing the pointer.

So the crash can only be avoided by not doing "find" on empty maps...

This behaviour could be reproduced on Windows 2k and XP using MSVC 6.0
and 7.0 and finally also on Solaris unsing the Sun CC 5.4.

The STL I stepped through was that contained with MSVC 7.0, but as
already mentioned, the same behaviour I experienced also with MSVC 6.0
and Sun CC 5.4.

Since several library implementations seem to share this particular
characteristic I would have expeted that it is well known or at least
documented somewhere but concluding from he postings here I think it
is not... :-(
This is not correct. It is perfectly permissible to use find with an
empty map. The bug must be elsewhere.

Bob


I dare say I would prefer the bug being elsewhere, because this
behaviour is annyoing for me. Would you have a suggestion what bug
outside the STL code could create the behaviour described above?
Thanks!

(Also thanks to all others who replied!)

Matthias
Jul 19 '05 #5

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

24
by: Duane Hebert | last post by:
2 questions: Given a map defined as std::map<int,string> stringmap; //How do you access the data_type (string) via an iterator? std::string spoo("doh");
3
by: Manuel Maria Diaz Gomez | last post by:
Hi everybody, This should be trivial, but I just can't see it. The following statement in a method doesn't work for me: (there's only one entry in myMap) map<const char*, int>::const_iterator...
2
by: ash | last post by:
Hi, I'm getting started with STL, and am stuck at creating a map container. I checked one of the texts and found a code in there. To make it simple, i wrote the following: #include...
44
by: jmoy | last post by:
I am a C programmer graduating to C++. As an exercise I wrote a program to count the number of times that different words occur in a text file. Though a hash table might have been a better choice,...
1
by: Saeed Amrollahi | last post by:
Dear All C++ Programmers Hello I am Saeed Amrollahi. I am a software engineer in Tehran Sewerage Company. I try to use std::map and map::find member function. I use Visual Studio .NET. my...
13
by: jstanforth | last post by:
This is probably a very obvious question, but I'm not clear on what operators need to be implemented for std::map.find() to work. For example, I have a class MyString that wraps std::string, and...
2
by: mergaite_lietuvaite | last post by:
Hi, I try to use map. My code is very easy, but there are some errors.... (by compiling). Plaese, could you say, what I do wrong.. struct less_array { bool operator()(const FArray p1, const...
6
by: Benny the Guard | last post by:
Been working on a project that compiles, links, and runs fine on 32-bit windows. Now trying to migrate to 64-bit windows. On debug build it works fine. However, on release build the std::map::find...
3
by: digz | last post by:
This is a very simplified version of something I am trying to understand. The State object holds the strings and maps , and I pass a reference to State to the process Function which manipulates it...
2
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 7 Feb 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:30 (7.30PM). In this month's session, the creator of the excellent VBE...
0
by: DolphinDB | last post by:
The formulas of 101 quantitative trading alphas used by WorldQuant were presented in the paper 101 Formulaic Alphas. However, some formulas are complex, leading to challenges in calculation. Take...
0
by: DolphinDB | last post by:
Tired of spending countless mintues downsampling your data? Look no further! In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
0
by: Aftab Ahmad | last post by:
Hello Experts! I have written a code in MS Access for a cmd called "WhatsApp Message" to open WhatsApp using that very code but the problem is that it gives a popup message everytime I clicked on...
0
by: Aftab Ahmad | last post by:
So, I have written a code for a cmd called "Send WhatsApp Message" to open and send WhatsApp messaage. The code is given below. Dim IE As Object Set IE =...
0
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
0
by: marcoviolo | last post by:
Dear all, I would like to implement on my worksheet an vlookup dynamic , that consider a change of pivot excel via win32com, from an external excel (without open it) and save the new file into a...
1
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
1
by: PapaRatzi | last post by:
Hello, I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.