added noexcept(false) to contract checking destructors so they can throw