Опасность увеличения размера программы
Встроенный деструктор может стать причиной непредвиденного увеличения размера программы, поскольку он вставляется в каждой точке выхода внутри функции для каждого активного локального объекта. Например, в следующем фрагменте
Account acct( "Tina Lee" );
int swt;
// ...
switch( swt ) {
case 0:
return;
case 1:
// что-то сделать
return;
case 2:
// сделать что-то другое
return;
// и так далее
}
компилятор подставит деструктор перед каждой инструкцией return. Деструктор класса Account невелик, и затраты времени и памяти на его подстановку тоже малы. В противном случае придется либо объявить деструктор невстроенным, либо реорганизовать программу. В примере выше инструкцию return в каждой метке case можно заменить инструкцией break с тем, чтобы у функции была единственная точка выхода:
// переписано для обеспечения единственной точки выхода
switch( swt ) {
case 0:
break;
case 1:
// что-то сделать
break;
case 2:
// сделать что-то другое
break;
// и так далее
}
// единственная точка выхода
return;
Упражнение 14.6
Напишите подходящий деструктор для приведенного набора членов класса, среди которых pstring адресует динамически выделенный массив символов:
class NoName {
public:
~NoName();
// ...
private:
char *pstring;
int ival;
double dval;
};
Упражнение 14.7
Необходим ли деструктор для класса, который вы выбрали в упражнении 14.3? Если нет, объясните почему. В противном случае предложите реализацию.
Упражнение 14.8
Сколько раз вызываются деструкторы в следующем фрагменте:
void mumble( const char *name, fouble balance, char acct_type )
{
Account acct;
if ( ! name )
return;
if ( balance <= 99 )
return;
switch( acct_type ) {
case 'z': return;
case 'a':
case 'b': return;
}
// ...
}