Re: This HAS to be UB...
"Victor Bazarov" <v.Abazarov@comAcast.net> wrote in message
news:gc39rg$q2m$1@news.datemas.de...
Chris M. Thomasson wrote:
Keep in mind that I am a C programmer; well, anyway here is the C++
program...
[...]
Well, the default implementation of the operator delete[] does *not* have
the "size" argument. In fact there are two allowed declarations of the
operator delete[]:
void operator delete[](void* ptr) throw();
and
void operator delete[](void* ptr, const std::nothrow&) throw();
I'm not sure what else to tell you.
I think that
void operator delete [](void*, std::size_t) throw();
is a valid declaration. I mean, even Comeau compiles the following program
without any warnings:
____________________________________________________________________
#include <cstdio>
#include <cstdlib>
#include <new>
struct custom_allocator {
static void* allocate(std::size_t size)
throw(std::bad_alloc) {
void* const mem = std::malloc(size);
if (! mem) {
throw std::bad_alloc();
}
std::printf("custom_allocator::allocate(%p, %lu)\n",
(void*)mem, (unsigned long)size);
return mem;
}
static void deallocate(void* const mem, std::size_t size)
throw() {
if (mem) {
std::printf("custom_allocator::deallocate(%p, %lu)\n",
(void*)mem, (unsigned long)size);
std::free(mem);
}
}
};
struct allocator_base {
void* operator new(std::size_t size)
throw(std::bad_alloc) {
return custom_allocator::allocate(size);
}
void* operator new [](std::size_t size)
throw(std::bad_alloc) {
return custom_allocator::allocate(size);
}
void operator delete(void* mem, std::size_t size)
throw() {
custom_allocator::deallocate(mem, size);
}
void operator delete [](void* mem, std::size_t size)
throw() {
custom_allocator::deallocate(mem, size);
}
};
template<std::size_t T_size>
class buf : public allocator_base {
char mem[T_size];
public:
virtual ~buf() throw() {}
};
class buf2 : public buf<1234> {
char mem2[1000];
};
int main() {
buf<1024>* b1 = new buf<1024>;
delete b1;
buf2* b2 = new buf2;
delete b2;
b2 = new buf2[5];
delete [] b2;
return 0;
}
____________________________________________________________________
Humm... Is Comeau screwing up and compiling non-compliant code without so
much as a warning?