This might relate to bug 34158 comment #6.

When throwing an exception in the constructor of an object being allocated as a
result of a call to a (placement) new expression, the corresponding (placement)
operator delete does not get called - unless the new expression is placed
inside a try-catch block AND the exception being throw can be caught by the
catch block.

The expected output of the code below would be (the address' may be different)
allocate 0x804a008
dealloc 0x804a008
allocate 0x804a008
dealloc 0x804a008
terminate called after throwing an instance of 'std::exception'
  what():  std::exception
Aborted

but unless the try-catch block is included, it outputs

allocate 0x804a008
dealloc 0x804a008
allocate 0x804a008
terminate called after throwing an instance of 'std::exception'
  what():  std::exception
Aborted

Note: If including the try-catch block, but changing the exception-declaration
of the catch to e.g. 'int', the operator delete still does not get called.



#include <iostream>
using namespace std;

struct Arena {
    void* allocate(std::size_t s) {return ::operator new(s);}
    void deallocate(void* p) { ::operator delete(p); }
};

inline void* operator new(std::size_t sz, Arena& a)
{
    void* p = a.allocate(sz);
    cout << "allocate " << p << endl;
    return p;
}

inline void operator delete(void* p, Arena& a)
{
    cout << "dealloc " << p << endl;
    a.deallocate(p);
}

struct Thrower {
    Thrower(bool b) { if (b) throw std::exception();}
};

int main()
{
    Arena arena;

    Thrower* p = new(arena) Thrower(false);

    operator delete(p, arena);

    //try {
        p = new(arena) Thrower(true); // <- Memory does not get deallocated
    //}
    //catch (std::exception&) {
    //    cout << "catch" << endl;
    //}

    return 0;
}


-- 
           Summary: Placement delete not called when constructor throws
           Product: gcc
           Version: 4.4.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: kian dot karas dot dev at gmail dot com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40066

Reply via email to