473,503 Members | 8,131 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

using a new_handler

I have made the following new_handler that I set in main:

/* ================== new_handler ================== */
void no_mem() {
std::cerr << "out of memory\n";
throw std::bad_alloc();
std::exit(1);
}

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?
May 20 '07 #1
5 2576
On May 20, 7:21 pm, desktop <f...@sss.comwrote:
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: ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
May 20 '07 #2
James Kanze wrote:
On May 20, 7:21 pm, desktop <f...@sss.comwrote:
>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: ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Ok the example I made was more or less based on Bjarne Stroustrup's
example on page 129 i the C++ Programming Language. His new_handler
looks like this:

void out_of_store() {
cerr << "operator new failed: out of store\n";
throw bad_alloc();
}

He also show a function that uses new:

void f() {
try{
for(;;) new char[10000];
}
catch(bad_alloc) {
cerr << "Memory exhausted!\n";
}
}

But I don't see why the out_of_store() function is needed if all
functions that uses new just makes sure to catch bad_alloc.

Would it not make more sense to make a new_handler that catches
bad_alloc and then omit the try/catch in all functions using new, since
the new_handler takes care of the catch for all new calls?
May 21 '07 #3
On May 21, 1:49 pm, desktop <f...@sss.comwrote:
James Kanze wrote:
On May 20, 7:21 pm, desktop <f...@sss.comwrote:
Ok the example I made was more or less based on Bjarne Stroustrup's
example on page 129 i the C++ Programming Language. His new_handler
looks like this:
void out_of_store() {
cerr << "operator new failed: out of store\n";
throw bad_alloc();

}
He also show a function that uses new:
void f() {
try{
for(;;) new char[10000];
}
catch(bad_alloc) {
cerr << "Memory exhausted!\n";
}
}
But I don't see why the out_of_store() function is needed if all
functions that uses new just makes sure to catch bad_alloc.
Probably, his goal was only to show how you can create a new
handler, not what it might be used for in practice. In this
exact example, for example, there really isn't much point in
using a new handler (and it's likely to fail anyway, at least on
some implementations, because cerr will also try to allocate
memory).
Would it not make more sense to make a new_handler that catches
bad_alloc and then omit the try/catch in all functions using new, since
the new_handler takes care of the catch for all new calls?
That's what I usually do. For various reasons, it's not
generally possible to reliably recover from insufficient memory.
My applications (large servers) generally run on dedicated
machines, with what should be sufficient memory; if memory runs
out, it's almost certainly because there is a memory leak, and
of course, at that point, recovery is impossible. But more
generally, not all systems reliably report out of memory, and
even less will allow you to intervene if you run out of memory
increasing the size of the stack, or something like that. So
you reserve a bit on the side, and install a new handler which
logs the problem, and aborts.

--
James Kanze (GABI Software) email:ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
May 21 '07 #4
On May 21, 1:49 pm, desktop <f...@sss.comwrote:
James Kanze wrote:
On May 20, 7:21 pm, desktop <f...@sss.comwrote:
Ok the example I made was more or less based on Bjarne Stroustrup's
example on page 129 i the C++ Programming Language. His new_handler
looks like this:
void out_of_store() {
cerr << "operator new failed: out of store\n";
throw bad_alloc();

}
He also show a function that uses new:
void f() {
try{
for(;;) new char[10000];
}
catch(bad_alloc) {
cerr << "Memory exhausted!\n";
}
}
But I don't see why the out_of_store() function is needed if all
functions that uses new just makes sure to catch bad_alloc.
Probably, his goal was only to show how you can create a new
handler, not what it might be used for in practice. In this
exact example, for example, there really isn't much point in
using a new handler (and it's likely to fail anyway, at least on
some implementations, because cerr will also try to allocate
memory).
Would it not make more sense to make a new_handler that catches
bad_alloc and then omit the try/catch in all functions using new, since
the new_handler takes care of the catch for all new calls?
That's what I usually do. For various reasons, it's not
generally possible to reliably recover from insufficient memory.
My applications (large servers) generally run on dedicated
machines, with what should be sufficient memory; if memory runs
out, it's almost certainly because there is a memory leak, and
of course, at that point, recovery is impossible. But more
generally, not all systems reliably report out of memory, and
even less will allow you to intervene if you run out of memory
increasing the size of the stack, or something like that. So
you reserve a bit on the side, and install a new handler which
logs the problem, and aborts.

--
James Kanze (GABI Software) email:ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
May 21 '07 #5
On May 21, 1:49 pm, desktop <f...@sss.comwrote:
James Kanze wrote:
On May 20, 7:21 pm, desktop <f...@sss.comwrote:
Ok the example I made was more or less based on Bjarne Stroustrup's
example on page 129 i the C++ Programming Language. His new_handler
looks like this:
void out_of_store() {
cerr << "operator new failed: out of store\n";
throw bad_alloc();

}
He also show a function that uses new:
void f() {
try{
for(;;) new char[10000];
}
catch(bad_alloc) {
cerr << "Memory exhausted!\n";
}
}
But I don't see why the out_of_store() function is needed if all
functions that uses new just makes sure to catch bad_alloc.
Probably, his goal was only to show how you can create a new
handler, not what it might be used for in practice. In this
exact example, for example, there really isn't much point in
using a new handler (and it's likely to fail anyway, at least on
some implementations, because cerr will also try to allocate
memory).
Would it not make more sense to make a new_handler that catches
bad_alloc and then omit the try/catch in all functions using new, since
the new_handler takes care of the catch for all new calls?
That's what I usually do. For various reasons, it's not
generally possible to reliably recover from insufficient memory.
My applications (large servers) generally run on dedicated
machines, with what should be sufficient memory; if memory runs
out, it's almost certainly because there is a memory leak, and
of course, at that point, recovery is impossible. But more
generally, not all systems reliably report out of memory, and
even less will allow you to intervene if you run out of memory
increasing the size of the stack, or something like that. So
you reserve a bit on the side, and install a new handler which
logs the problem, and aborts.

--
James Kanze (GABI Software) email:ja*********@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
May 21 '07 #6

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

Similar topics

2
5876
by: rawCoder | last post by:
Hi All, I have a *.cer file, a public key of some one and I want to encrypt some thing using this public key. Can someone point me to a sample code for Encrypting some file using...
1
567
by: Mike | last post by:
When trying to compile (using Visual Web Developer 2005 Express Beta; frameworkv2.0.50215 ) the source code below I get errors (listed below due to the use of ICallBackEventHandler. Ultimately I...
10
2631
by: Christopher Benson-Manica | last post by:
Why can't I use a class destructor in a using declaration: using MyClass::~MyClass; ? -- Christopher Benson-Manica | I *should* know what I'm talking about - if I ataru(at)cyberspace.org ...
17
3480
by: beliavsky | last post by:
Many of my C++ programs have the line using namespace std; but the "Accelerated C++" book of Koenig and Moo has many examples where the library names are included one at a time, for example ...
8
4894
by: Petter Reinholdtsen | last post by:
I ran into a problem on HP-UX 11.00 the other day, where it refused to compile a program using 'using namespace std;' at the top. The reason seem to be that the compiler refuses to accept 'using...
14
2124
by: john.burton.email | last post by:
I've done some extensive searching and can't seem to find an answer to this - Is it correct to using "using" with templates, for example: using std::vector; Or do I need to specify the type...
5
5687
by: Enos Meroka | last post by:
Hallo, I am a student doing my project in the university.. I have been trying to compile the program using HP -UX aCC compiler, however I keep on getting the following errors. ...
3
8210
by: JDeats | last post by:
I have some .NET 1.1 code that utilizes this technique for encrypting and decrypting a file. http://support.microsoft.com/kb/307010 In .NET 2.0 this approach is not fully supported (a .NET 2.0...
71
19035
by: desktop | last post by:
I have read in Bjarne Stroustrup that using malloc and free should be avoided in C++ because they deal with uninitialized memory and one should instead use new and delete. But why is that a...
0
7207
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
7093
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
7357
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...
0
7468
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...
0
5598
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,...
0
4690
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...
0
3171
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
1
748
muto222
by: muto222 | last post by:
How can i add a mobile payment intergratation into php mysql website.
0
402
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...

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.