473,695 Members | 2,605 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

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 26394
"Matthias Hildebrand" <hi********@u ni-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.go ogle.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
17306
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
7456
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 it = myMap.find(key); where key is a const char* passed by the class method.
2
2336
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 <iostream.h> #include <string.h> #include <map>
44
8786
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, I chose to use std::map. However, the program runs at less than half the speed of an equivalent program that uses ordinary handcoded binary trees. The result is not changed very much if I replace std::string as the key with a simple string class...
1
3551
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 program uses two MFC classes: CRect and CPoint which represents Rectangle and Point concepts (as usual) and a user
13
4622
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 which also implements ==, <, <=, >, >=, etc. (Those operators are tested and working correctly.) If I assign map = "world", it saves the MyString's correctly in the map. But a subsequent call to map.find("hello") returns map.end(). Even more...
2
2399
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 FArray p2) const { return p1 < p2 ;
6
2446
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 operation starts acting odd. My code simply does a lookup, if it fails it inserts the proper element (creating the data element is expensive so I only want to do it if needed and many times its not). In the lookup I see the size is 0 (since...
3
2059
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 based on the tag passed in. I cannot pass the strings/maps in question as references coz .. a) thats redundant, state has everything, it increases number of parameters unnecessarily b) I have to do the case/switch outside the function to...
0
9122
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
0
9001
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth. The Art of Business Website Design Your website is...
1
8860
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...
0
8832
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
0
7670
agi2029
by: agi2029 | last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing, and deployment—without human intervention. Imagine an AI that can take a project description, break it down, write the code, debug it, and then launch it, all on its own.... Now, this would greatly impact the work of software developers. The idea...
0
5841
by: conductexam | last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one. At the time of converting from word file to html my equations which are in the word document file was convert into image. Globals.ThisAddIn.Application.ActiveDocument.Select();...
0
4348
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
0
4587
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
3
1980
bsmnconsultancy
by: bsmnconsultancy | last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...

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.