|
Boost Users : |
From: David Abrahams (dave_at_[hidden])
Date: 2004-08-23 19:33:01
"Mark Storer" <MStorer_at_[hidden]> writes:
>> No it is not. Even if you aren't throwing due to memory starvation,
>> you could run out of memory during unwinding, when the exception is
>> copied. That leads you directly to terminate(). Do not pass Go; do
>> not collect $200.
>
> Venturing a little far afield, but one technique I've heard of is to
> grab a block, so you can release it in low-memory situations (or just
> every time you throw). This ensures (in theory) that you'll have
> enough memory to copy your exception, create your strings, and so on.
> If you manage to recover, you just grab another block ("prime the
> pump") and soldier bravely forward.
>
> Given STL's habit of allowing people to specify an allocator, you
> could even go so far as to build a custom allocator that worked on
> some pre-allocated block of memory for your exceptions (strings,
> vectors, whatever you deem necessary).
>
> Either way, you'll run out of memory a little earlier (not a big issue
> in many environments), but you _will_ get to pocket the $200.
Maybe. You can still exhaust your pre-allocated buffer. There's no
need to play with fire here; it doesn't buy you much and it's easy to
avoid.
-- Dave Abrahams Boost Consulting http://www.boost-consulting.com
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net