C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Calling builtin new

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ language (comp.lang.c++)
View previous topic :: View next topic  
Author Message
Shayne Wissler
Guest





PostPosted: Fri Jan 30, 2004 8:05 pm    Post subject: Calling builtin new Reply with quote



I've overloaded the global new operator, so that I can, detect when I've run
out of memory:

extern void* operator new(size_t s) {
void *r = malloc(s);
if (!r && s) {
fprintf(stderr, "Error: No more memory.");
exit(1);
}
return r;
}

The problem here is that I don't really want to call malloc (and--Valgrind
is quite noisy about me doing this); I want to call the implementation of
new that I overrode. Suggestions?


Thanks,
Shayne Wissler


Back to top
Le Géant Vert
Guest





PostPosted: Fri Jan 30, 2004 8:21 pm    Post subject: Re: Calling builtin new Reply with quote



Shayne Wissler wrote:

Quote:
I've overloaded the global new operator, so that I can, detect when I've run
out of memory:

extern void* operator new(size_t s) {
void *r = malloc(s);
if (!r && s) {
fprintf(stderr, "Error: No more memory.");
exit(1);
}
return r;
}

The problem here is that I don't really want to call malloc (and--Valgrind
is quite noisy about me doing this); I want to call the implementation of
new that I overrode. Suggestions?


Thanks,
Shayne Wissler




I've done quite the same thing to detect memory leaks due to mismatching

new/delete ; what I've done overload operator new with some more
parameters : the size, the filename of the source, and the line (to
display where memory leak occurs).
if you do as I've done (to display where "out of memory" occurs for
example), you'll have something like :

void *operator new(size_t, char *, unsigned long);

and you won't have any problem calling the original ::operator new(size_t)

.... my solution... if anyone has a better idea...

Back to top
Thomas Matthews
Guest





PostPosted: Fri Jan 30, 2004 9:50 pm    Post subject: Re: Calling builtin new Reply with quote



Shayne Wissler wrote:
Quote:
I've overloaded the global new operator, so that I can, detect when I've run
out of memory:

My understanding is that the "new" operator throws an exception
when there are memory problems. Perhaps you could catch the
exception to detect when you've run out of memory.


Quote:
extern void* operator new(size_t s) {
void *r = malloc(s);
if (!r && s) {
fprintf(stderr, "Error: No more memory.");
exit(1);
}
return r;
}

The problem here is that I don't really want to call malloc (and--Valgrind
is quite noisy about me doing this); I want to call the implementation of
new that I overrode. Suggestions?

Here I don't understand. If you overload the global new operator,
then have your function call the global new operator, isn't this
called recursion (or perhaps an infinite loop)?

Quote:


Thanks,
Shayne Wissler




--
Thomas Matthews

C++ newsgroup welcome message:
http://www.slack.net/~shiva/welcome.txt
C++ Faq: http://www.parashift.com/c++-faq-lite
C Faq: http://www.eskimo.com/~scs/c-faq/top.html
alt.comp.lang.learn.c-c++ faq:
http://www.raos.demon.uk/acllc-c++/faq.html
Other sites:
http://www.josuttis.com -- C++ STL Library book


Back to top
Shayne Wissler
Guest





PostPosted: Fri Jan 30, 2004 10:27 pm    Post subject: Re: Calling builtin new Reply with quote


"Thomas Matthews" <Thomas_MatthewsSpitsOnSpamBots (AT) sbcglobal (DOT) net> wrote in
message news:RkASb.13798$fH5.5665 (AT) newssvr16 (DOT) news.prodigy.com...
Quote:
Shayne Wissler wrote:
I've overloaded the global new operator, so that I can, detect when I've
run
out of memory:

My understanding is that the "new" operator throws an exception
when there are memory problems. Perhaps you could catch the
exception to detect when you've run out of memory.

It does indeed, thanks. However, I caught with catch(...) when I tested
this, is there a standard exception I should be catching instead of this
catch-all?

Quote:
The problem here is that I don't really want to call malloc
(and--Valgrind
is quite noisy about me doing this); I want to call the implementation
of
new that I overrode. Suggestions?

Here I don't understand. If you overload the global new operator,
then have your function call the global new operator, isn't this
called recursion (or perhaps an infinite loop)?

What I meant was that I want to call the builtin-new, the one I had
overridden. Just like when I override a virtual method, I can still call the
base class's version of that method. How do I refer to the "base" version of
the new operator?


Shayne Wissler



Back to top
Rolf Magnus
Guest





PostPosted: Fri Jan 30, 2004 10:39 pm    Post subject: Re: Calling builtin new Reply with quote

Shayne Wissler wrote:

Quote:

"Thomas Matthews" <Thomas_MatthewsSpitsOnSpamBots (AT) sbcglobal (DOT) net> wrote
in message news:RkASb.13798$fH5.5665 (AT) newssvr16 (DOT) news.prodigy.com...
Shayne Wissler wrote:
I've overloaded the global new operator, so that I can, detect when
I've
run
out of memory:

My understanding is that the "new" operator throws an exception
when there are memory problems. Perhaps you could catch the
exception to detect when you've run out of memory.

It does indeed, thanks. However, I caught with catch(...) when I
tested this, is there a standard exception I should be catching
instead of this catch-all?

yes, std::bad_alloc.

Quote:
The problem here is that I don't really want to call malloc
(and--Valgrind
is quite noisy about me doing this); I want to call the
implementation
of
new that I overrode. Suggestions?

Here I don't understand. If you overload the global new operator,
then have your function call the global new operator, isn't this
called recursion (or perhaps an infinite loop)?

What I meant was that I want to call the builtin-new, the one I had
overridden. Just like when I override a virtual method, I can still
call the base class's version of that method.

That's a member of another class though.

Quote:
How do I refer to the "base" version of the new operator?

I don't know if that's possible at all.



Back to top
Shayne Wissler
Guest





PostPosted: Fri Jan 30, 2004 11:05 pm    Post subject: Re: Calling builtin new Reply with quote


"Rolf Magnus" <ramagnus (AT) t-online (DOT) de> wrote


Quote:
It does indeed, thanks. However, I caught with catch(...) when I
tested this, is there a standard exception I should be catching
instead of this catch-all?

yes, std::bad_alloc.

Thanks.

Quote:
Here I don't understand. If you overload the global new operator,
then have your function call the global new operator, isn't this
called recursion (or perhaps an infinite loop)?

What I meant was that I want to call the builtin-new, the one I had
overridden. Just like when I override a virtual method, I can still
call the base class's version of that method.

That's a member of another class though.

The principle is the same.

Quote:
How do I refer to the "base" version of the new operator?

I don't know if that's possible at all.

One ought to be able to do such a thing.


Shayne Wissler



Back to top
Rolf Magnus
Guest





PostPosted: Fri Jan 30, 2004 11:26 pm    Post subject: Re: Calling builtin new Reply with quote

Shayne Wissler wrote:

Quote:
Here I don't understand. If you overload the global new operator,
then have your function call the global new operator, isn't this
called recursion (or perhaps an infinite loop)?

What I meant was that I want to call the builtin-new, the one I had
overridden. Just like when I override a virtual method, I can still
call the base class's version of that method.

That's a member of another class though.

The principle is the same.

Not really. You want to call a built-in function from a user-defined
function that replaces it, which is very different from the overloading
example, where you just call a user-defined fuction from another
user-defined function.
Other example: If you implement your own operator=(), how would you call
the builtin operator=() for the same class from that? I'd assume there
is none in this case (after all - you replaced it), so it can't be
called.

Quote:
How do I refer to the "base" version of the new operator?

I don't know if that's possible at all.

One ought to be able to do such a thing.

As I said, I don't know.


Back to top
lilburne
Guest





PostPosted: Fri Jan 30, 2004 11:31 pm    Post subject: Re: Calling builtin new Reply with quote

Thomas Matthews wrote:

Quote:
Shayne Wissler wrote:

I've overloaded the global new operator, so that I can, detect when
I've run
out of memory:


My understanding is that the "new" operator throws an exception
when there are memory problems. Perhaps you could catch the
exception to detect when you've run out of memory.


Why not simply do a:

void myFunctionToCallWhenOutOfMemory();

set_new_handler(myFunctionToCallWhenOutOfMemory);

Section 18.4.2.2 and 18.4.2.3. Then you get to find out when
memory is exhausted, before exceptions are thrown, and have
the opportunity to free up some memory (page out to
secondary storage). If a handler is set two attempts are
made to obtain memory the exception is only thrown if the
second attempt fails.


Back to top
Shayne Wissler
Guest





PostPosted: Sat Jan 31, 2004 12:13 am    Post subject: Re: Calling builtin new Reply with quote


"Rolf Magnus" <ramagnus (AT) t-online (DOT) de> wrote

Quote:
Shayne Wissler wrote:

Here I don't understand. If you overload the global new operator,
then have your function call the global new operator, isn't this
called recursion (or perhaps an infinite loop)?

What I meant was that I want to call the builtin-new, the one I had
overridden. Just like when I override a virtual method, I can still
call the base class's version of that method.

That's a member of another class though.

The principle is the same.

Not really. You want to call a built-in function from a user-defined
function that replaces it, which is very different from the overloading
example, where you just call a user-defined fuction from another
user-defined function.

I said the principle was the same, not the scenario.


Shayne Wissler



Back to top
Rolf Magnus
Guest





PostPosted: Sat Jan 31, 2004 11:35 am    Post subject: Re: Calling builtin new Reply with quote

Shayne Wissler wrote:

Quote:

"Rolf Magnus" <ramagnus (AT) t-online (DOT) de> wrote in message
news:bvepo6$vug$04$1 (AT) news (DOT) t-online.com...
Shayne Wissler wrote:

Here I don't understand. If you overload the global new
operator, then have your function call the global new operator,
isn't this called recursion (or perhaps an infinite loop)?

What I meant was that I want to call the builtin-new, the one I
had overridden. Just like when I override a virtual method, I
can still call the base class's version of that method.

That's a member of another class though.

The principle is the same.

Not really. You want to call a built-in function from a user-defined
function that replaces it, which is very different from the
overloading example, where you just call a user-defined fuction from
another user-defined function.

I said the principle was the same, not the scenario.

And my point is that the principle is not at all the same. One is simple
calling a regular function, the other one is calling a built-in that
was replaced.


Back to top
Jerry Coffin
Guest





PostPosted: Sat Feb 14, 2004 6:57 am    Post subject: Re: Calling builtin new Reply with quote

In article <DOySb.59476$U%5.345456@attbi_s03>, [email]thalesNOSPAM000 (AT) yahoo (DOT) com[/email]
says...
Quote:
I've overloaded the global new operator, so that I can, detect when I've run
out of memory:

There's no need to overload operator new to handle this -- the library
provides set_new_handler for precisely this purpose.

Quote:
The problem here is that I don't really want to call malloc (and--Valgrind
is quite noisy about me doing this); I want to call the implementation of
new that I overrode. Suggestions?

Yes: don't even try this -- it's doomed from the beginning.

From the viewpoint of the compiler, you've overridden a function which
is fine and well. From the viewpoint of the linker (at least on the
typical implementations that use linkers) this operator satisfies all
external references in the program to the symbol with whatever name
global operator new mangles to with your compiler. Since the references
to the name have been satisfied, the linker will NOT include the one
that's in the standard library.

IOW, you can't call it because in your program it doesn't even exist.

--
Later,
Jerry.

The universe is a figment of its own imagination.

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ language (comp.lang.c++) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.