Если по какой-то странной причине у вас нет доступа к стандартным библиотекам, то очень легко реализовать столько, сколько вам нужно, типа интеллектуального указателя для управления ресурсом. Это может выглядеть немного многословно, но это меньше кода, чем эти вложенные блоки try / catch, и вам нужно определить этот шаблон только один раз, а не один раз для ресурса, который требует управления:
template<typename T>
struct MyDeletable {
explicit MyDeletable(T *ptr) : ptr_(ptr) { }
~MyDeleteable() { delete ptr_; }
private:
T *ptr_;
MyDeletable(const MyDeletable &);
MyDeletable &operator=(const MyDeletable &);
};
void myfunction() {
// it's generally recommended that these two be done on one line.
// But it's possible to overdo that, and accidentally write
// exception-unsafe code if there are multiple parameters involved.
// So by all means make it a one-liner, but never forget that there are
// two distinct steps, and the second one must be nothrow.
Object *myObject = new Object();
MyDeletable<Object> deleter(myObject);
// do something with my object
return;
}
Конечно, если вы сделаете это, а затем используете RAII в оставшейся части кода, вам в конечном итоге понадобятся все функции стандарта и улучшенные типы интеллектуальных указателей. Но это только начало, и я делаю то, что, я думаю, ты хочешь.
Метод try ... catch, вероятно, не сработает в условиях программирования обслуживания. Блок CLEAN UP не гарантированно будет выполнен: например, если код «сделать что-то» возвращается рано или каким-то образом выдает что-то, что не является исключением. С другой стороны, деструктор «delete» в моем коде гарантированно будет выполняться в обоих этих случаях (хотя и не в случае завершения программы).