Re: Overloading operator delete problem
albrecht.fritzsche wrote:
I've overloaded operator new and operator delete like in the
appended code but don't know how to trigger a call to the
nothrow-delete.
Throw an exception from a constructor called by new(nothrow).
(BTW: I think you mean you've replaced the standard functions.
Overloading would imply that you defined additional functions,
with different parameters.)
While the call to the nothrow-new is easy by specifying
int* p = new(nothrow) int;
how do I call the nothrow-delete
delete (nothrow) p;
does not work.
You don't call it, the compiler does. And only if you exit the
constructor by an exception in a new(nothrow).
Normally, too, you wouldn't replace new(nothrow) without also
replacing the standard new and delete. For the simple reason
that memory allocated with new(nothrow) will be freed with the
standard delete.
At least on Vis C++ the appended code compiles but uses for
the last delete the throwing-delete version.
The non-placement delete, as it should. All deletes should be
non-throwing.
How do I have to specify the std::nothrow? Where is this
actually documented in the standard?
In ?18.4 and ?5.3.4.
And, why do I get a strange error from Comeau (online) with
exactly this code saying
"ComeauTest.c", line 6: error: exception specification is incompatible
with that of
previous function "operator delete(void *)" (declared at line
67 of
"new.stdh"):
previously specified: no exceptions will be thrown
void operator delete(void* memory) throw(std::bad_alloc) {
Because delete must have an exception specifier throw(). It is
not allowed to throw an exception.
#include <new>
#include <cstdlib>
void* operator new(size_t count) throw (std::bad_alloc) {
return malloc(count);
This is illegal. You've violated the contract. You have to do
something like:
void* result = malloc( count ) ;
if ( result == NULL ) {
throw std::bad_alloc() ;
}
return result ;
In a more general version, you should probably check if the
new_handler has been set as well. (But I often skip this; any
global operator new that I replace will be specific to the
application, and if I know that the application never sets the
new_handler, I don't have to worry about it.)
}
void operator delete(void* memory) throw(std::bad_alloc) {
Should be:
void operator delete( void* memory ) throw() {
free(memory);
}
void* operator new(size_t count, const std::nothrow_t&) throw () {
return malloc(count);
}
void operator delete(void* memory, const std::nothrow_t&) throw() {
free(memory);
}
int main() {
int* i = new int();
int* j = new(std::nothrow) int();
delete i;
delete /*(std::nothrow)*/ j; // how to specify the nothrow?
You can't, here.
return 0;
}
--
James Kanze GABI Software
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
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]