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); }