What happens if delete[] p fails?

后端 未结 6 831
醉酒成梦
醉酒成梦 2021-02-07 03:52

Suppose I have a pointer to a dynamically allocated array of 10 elements:

T* p = new T[10];

Later, I want to release that array:



        
6条回答
  •  盖世英雄少女心
    2021-02-07 04:29

    Okay, here is some experimental code:

    #include 
    #include 
    #include 
    #include 
    
    void* operator new[](size_t size) throw (std::bad_alloc)
    {
        std::cout << "allocating " << size << " bytes" << std::endl;
        return malloc(size);
    }
    
    void operator delete[](void* payload) throw ()
    {
        std::cout << "releasing memory at " << payload << std::endl;
        free(payload);
    }
    
    struct X
    {
        bool throw_during_destruction;
    
        ~X()
        {
            std::cout << "destructing " << (void*)this << std::endl;
            if (throw_during_destruction) throw 42;
        }
    };
    
    int main()
    {
        X* p = new X[10]();
        p[5].throw_during_destruction = true;
        p[1].throw_during_destruction = true;
        delete[] p;
    }
    

    Running the code gave the following output on g++ 4.6.0:

    allocating 14 bytes
    destructing 0x3e2475
    destructing 0x3e2474
    destructing 0x3e2473
    destructing 0x3e2472
    destructing 0x3e2471
    terminate called after throwing an instance of 'int'
    
    This application has requested the Runtime to terminate it in an unusual way.
    Please contact the application's support team for more information.
    

    So it would seem that std::terminate is called immediately as soon as the first destructor throws. The other elements are not destructed, and the memory is not released. Can anyone confirm this?

提交回复
热议问题