c++ - bug with overloading global operator new()?
I tried an example from Bruce Eckel's "Thinking in C++" which overloads the global operator new. (I'm using 8.38 of DMC++). Here's a snippet of code from the example: .. #include <cstdio> #include <cstdlib> using namespace std; void* operator new(size_t sz) { printf("operator new: %d Bytes\n", sz); .. } void operator delete(void* m) { printf("operator delete"); .. } class S { int i[100]; public: S() { ... } ~S() { ... } }; int main() { int* p = new int(47); delete p; S* s = new S; delete s; S* sa = new S[3]; delete []sa; } For the first two 'new' operators, the overloaded 'new' gets called and I get the message. In addition, the overloaded 'delete' gets called to deallocate the objects. However, when the array of S[3] objects is allocated, the overloaded 'new' does NOT get called. An examination of the assembly code shows a call to a mangled name containing 'vec_new'. Interestingly, the overloaded 'delete' DOES get called to deallocate the array. I've tried this example under g++ and the overloaded 'new' gets called in all three cases, as Bruce Eckel indicates. (As a side note, the DMC option '-Aa', which enables new[] and delete[] to be overloaded for classes, has no effect.) What is this 'vec_new'? Does the C++ standard require the overloaded 'new' to be called in all three cases? I was able to create a global overloaded operator called 'operator new[]' which WAS called by DMC in the final case. I'm wondering if the DMC compiler sees the last operator as 'operator new[]' and not 'operator new'. Is it possible the Eckel book (and g++) has it wrong? -Sean
Jan 28 2004
I decided to dig a bit more on this topic. After checking 'C++ In A Nutshell'
(the O'Reilly book which covers ISO 14882 standard C++), the explanation there
is 'operator new' is called when allocating single objects and 'operator new[]'
is called by the compiler when allocating arrays of objects. ('delete' and
'delete[]' operate similarly). This is true for both global versions of these
functions and member function versions.
So it would seem that DMC's behavior is correct. Well done Walter!
-Sean
In article <bv8iob$gmu$1 digitaldaemon.com>, Sean Wall says...
I tried an example from Bruce Eckel's "Thinking in C++" which overloads the
global operator new. (I'm using 8.38 of DMC++). Here's a snippet of code from
the example:
..
#include <cstdio>
#include <cstdlib>
using namespace std;
void* operator new(size_t sz) {
printf("operator new: %d Bytes\n", sz);
..
}
void operator delete(void* m) {
printf("operator delete");
..
}
class S {
int i[100];
public:
S() { ... }
~S() { ... }
};
int main() {
int* p = new int(47);
delete p;
S* s = new S;
delete s;
S* sa = new S[3];
delete []sa;
}
For the first two 'new' operators, the overloaded 'new' gets called and I get
the message. In addition, the overloaded 'delete' gets called to deallocate the
objects. However, when the array of S[3] objects is allocated, the overloaded
'new' does NOT get called. An examination of the assembly code shows a call to
a mangled name containing 'vec_new'. Interestingly, the overloaded 'delete'
DOES get called to deallocate the array. I've tried this example under g++ and
the overloaded 'new' gets called in all three cases, as Bruce Eckel indicates.
(As a side note, the DMC option '-Aa', which enables new[] and delete[] to be
overloaded for classes, has no effect.)
What is this 'vec_new'? Does the C++ standard require the overloaded 'new' to
be called in all three cases? I was able to create a global overloaded operator
called 'operator new[]' which WAS called by DMC in the final case. I'm
wondering if the DMC compiler sees the last operator as 'operator new[]' and not
'operator new'. Is it possible the Eckel book (and g++) has it wrong?
-Sean
Jan 28 2004
"Sean Wall" <Sean_member pathlink.com> wrote in message news:bv8nj5$opq$1 digitaldaemon.com...I decided to dig a bit more on this topic. After checking 'C++ In ANutshell'(the O'Reilly book which covers ISO 14882 standard C++), the explanationthereis 'operator new' is called when allocating single objects and 'operatornew[]'is called by the compiler when allocating arrays of objects. ('delete'and'delete[]' operate similarly). This is true for both global versions ofthesefunctions and member function versions. So it would seem that DMC's behavior is correct. Well done Walter!Thanks! BTW, Bruce & Chuck helped me get DMC++ to be successful with their book examples.
Feb 11 2004








"Walter" <walter digitalmars.com>