typedef void* MemoryHandle;

__declspec(noreturn)
void InduceAbandonment()
{
    // RaiseFailFastException - https://msdn.microsoft.com/en-us/library/windows/desktop/dd941688(v=vs.85).aspx
}
__declspec(noreturn)
void InitializationFailure()
{
    InduceAbandonment();
}
__declspec(noreturn)
void TerribleFailure()
{
    InduceAbandonment();
}
template <typename T>
T* MemoryAllocation()
{
    T* obj = new T();
    if (!obj)
    {
        InduceAbandonment();
    }
    return obj;
}

class MemoryObject
{
public:
    void Init()
    {
        InitializationFailure();
    }
};

MemoryHandle MemoryPropagator()
{
    return MemoryAllocation<MemoryObject>();
}

void MemoryAndErrorPropagator(MemoryHandle* handle)
{
    MemoryObject* object = MemoryAllocation<MemoryObject>();
    object->Init();
}

void ErrorRecoveryInitiator(MemoryHandle handle)
{
    TerribleFailure();
}

void ErrorRecoveryPropagator()
{
    // Any failures are now program terminations. So this function cleans up very well.
    MemoryHandle handle = MemoryPropagator();
    MemoryHandle handle2;
    MemoryAndErrorPropagator(&handle2);
    ErrorRecoveryInitiator(handle2);
}