This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: libstdc++ Digest 3 Aug 2006 18:42:06 -0000 Issue 2181





---------- Forwarded message ---------- From: Paolo Carlini <pcarlini@suse.de> To: libstdc++ <libstdc++@gcc.gnu.org> Date: Thu, 03 Aug 2006 20:42:51 +0200 Subject: Why a try/catch in priority_queue::push/pop?!? Hi,

today I noticed by chance these strange things: for example, push
(likewise pop):

      void
      push(const value_type& __x)
      {
    try
        {
          c.push_back(__x);
          std::push_heap(c.begin(), c.end(), comp);
        }
    catch(...)
        {
          c.clear();
          __throw_exception_again;
        }
      }

why that try/catch? Certainly I cannot find support in the Standard for
its presence and, AFAICS, can also run against reasonable user
expectations: i.e., if c.push_back throws (e.g., bad_alloc) the user may
reasonably expect that c remains unchanged! The case of push_heap is
different, more complex, but again, I don't think the user, basing on
the letter of the Standard can generally (i.e., portably) expect that a
clear() will be invoked (supposedly to do him the "favor" of a
"consistent", read, empty! , container)

I think the try/catch is very old, coming from the HP/SGI STL, maybe I
missing historical facts which I'd like to know... Anyone helping?

IIRC, all containers are required to leave containers in a consistent state after push & pop operations. This seems to be an implementation of that particular requirement. IMHO, there could be 2 levels of try & catch blocks. One for inserting into the container, and another for re-creating the heap structure.

Somthing like:

try {
c.push_back();
} catch(...) {
throw exception again;
}

try {
push_heap();
} catch(...) {
c.clear();
}


Which means that if the container throws in push_back(), then u don't need to clear the whole heap. I may be wrong though.

Regards,
-Dhruv.





Thanks, Paolo.





--
  -Dhruv Matani.
http://www.geocities.com/dhruvbird/

"The biggest room is the room for improvement."
    -- Navjot Singh Siddhu.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]