How to avoid successive deallocations/allocations in C++?

前端 未结 10 1047
失恋的感觉
失恋的感觉 2021-02-07 18:26

Consider the following code:

class A
{
    B* b; // an A object owns a B object

    A() : b(NULL) { } // we don\'t know what b will be when constructing A

             


        
10条回答
  •  Happy的楠姐
    2021-02-07 19:14

    If B correctly implements its copy assignment operator then b = B(...) should not call any destructor on b. It is the most obvious solution to your problem.

    If, however, B cannot be appropriately 'default' initialized you could do something like this. I would only recommend this approach as a last resort as it is very hard to get safe. Untested, and very probably with corner case exception bugs:

    // Used to clean up raw memory of construction of B fails
    struct PlacementHelper
    {
        PlacementHelper() : placement(NULL)
        {
        }
    
        ~PlacementHelper()
        {
            operator delete(placement);
        }
    
        void* placement;
    };
    
    void calledVeryOften(....)
    {
        PlacementHelper hp;
    
        if (b == NULL)
        {
            hp.placement = operator new(sizeof(B));
        }
        else
        {
            hp.placement = b;
            b->~B();
            b = NULL;  // We can't let b be non-null but point at an invalid B
        }
    
        // If construction throws, hp will clean up the raw memory
        b = new (placement) B(param1, param2, param3, param4);
    
        // Stop hp from cleaning up; b points at a valid object
        hp.placement = NULL;
    }
    

提交回复
热议问题