Re: using a new_handler
On May 20, 7:21 pm, desktop <f...@sss.com> wrote:
I have made the following new_handler that I set in main:
Two comments:
/* ================== new_handler ==
================= */
void no_mem() {
std::cerr << "out of memory\n";
Id this is the first use of std::cerr, there's a certain
probability that it will try to allocate memory. Which may lead
to endless recursion.
The usual technique when you want to do something like this is
to pre-allocate a hopefully big enough block, and free it in the
handler, immediately before using cerr.
throw std::bad_alloc();
std::exit(1);
And of course, since you've thrown an exception in the preceding
line, this line will never be reached. (From experience, the
"usual" new handler is something like:
void
no_mem()
{
delete [] preallocated ;
std::cerr << "Out of memory" << std::endl ;
abort() ;
}
}
void init(int length, int* data) {
try {
data = new int [length];
}
catch(std::bad_alloc){
std::cerr<< "out of memory\n";
}
}
int main() {
// Initialize the new_handler.
std::set_new_handler(&no_mem);
int* data;
int i = 4;
init(i,data);
return 0;
}
But is it necessary to catch the exception in "init" or will it also be
caught by the new_handler?
In your case, the new handler is throwing the exception, not
catching it. The new handler is called before the exception is
thrown, and will normally not see it.
--
James Kanze (Gabi Software) email: james.kanze@gmail.com
Conseils en informatique orient=E9e objet/
Beratung in objektorientierter Datenverarbeitung
9 place S=E9mard, 78210 St.-Cyr-l'=C9cole, France, +33 (0)1 30 23 00 34