[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.c++

Re: This HAS to be UB...

Chris M. Thomasson

10/5/2008 1:37:00 AM


"Chris M. Thomasson" <no@spam.invalid> wrote in message news:...
>
> "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?