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? 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
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?
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
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
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 This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
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...
|
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...
|
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 ...
|
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
...
|
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...
| |
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...
|
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.
...
|
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...
|
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...
|
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,...
|
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...
| |
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...
|
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...
|
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,...
|
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...
|
by: adsilva |
last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
|
by: muto222 |
last post by:
How can i add a mobile payment intergratation into php mysql website.
| |
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...
| |