В вашем примере вы можете переместить объявление f
в блок try
, чтобы убедиться, что оно уничтожает себя;деструктор знает состояние объекта.
В качестве другого примера, с выделением памяти вы можете инициализировать указатель на 0 до того, как память фактически будет выделена, а затем снова сбросить его на ноль, когда вы освободите выделенную память.Это позволит вам проверить, была ли выделена память, чтобы избежать освобождения памяти, которая больше не принадлежит вам.Пример:
char *name = 0;
try {
// perform some operations which may throw...
// now allocate
name = new char[20];
// more error prone operations here
}
catch(...){
if(name != 0){
delete[] name;
name = 0;
}
}
Опять же, вы можете использовать RAII и здесь.Пример:
class MyCharArray {
char *str;
public:
MyCharArray(size_t size){
str = new char[size];
}
~MyCharArray(){
delete[] str;
}
};
int main(){
try {
// perform some operations which may throw...
MyCharArray name(20);
// more error prone operations here
}
catch(...){
// no additional error handling required here
}
return 0;
}
Обратите внимание, что RAII считается лучшим, потому что вы пишете код очистки только один раз - в деструкторе - а не после каждого try
блока.