понедельник, 12 января 2009 г.

Орфоргафия и политика

Открылся уникальный проект - http://blog.kremlin.ru. Теперь любой может воспользоваться услугами экспертов-лингвистов для проверки текста на орфографические и пунктуационные ошибки. При том совершенно бесплатно! Просто регистрируемся по ссылке выше, пишем комментарий, содержащий проверяемый текст - и вуаля! - через некоторое время получаем отредактированный вариант.
Есть, правда пара неудобств. Во-первых, писать только по-русски можно. А во-вторых, в начале каждого сочинения надо писать "Уважаемый Дмитрий Анатольевич!".

среда, 24 декабря 2008 г.

Виртуальный деструктор

На данный момент основным языком разработки для меня является C++. Сейчас и далее я планирую публиковать интересные, на мой взгляд, приемы / примеры использования / сведения об этом языке.
Сегодня речь пойдет о виртуальных деструкторах.
В отличии от конструкторов, деструкторы, сродни обычным функциям, могут быть виртуальными. главный вопрос - зачем это нужно и когда их следует использовать?
Все случаи использования виртуальных деструкторов я вывел в 4 пункта.

Всегда объявляйте деструктор виртуальным, если класс, в котором он содержится, предполагает поддержку наследования (даже если вы точно знаете, что деструктор потомка не будет нести никакой функциональной нагрузки, объявите его виртуальным в базовом классе - кто-то может написать класс, наследуемый от потомка вашего и работать с ним через указатель на ваш класс).

Пример:
struct A {
virtual ~A (void) {}
};

struct B: A {
B (void) { p = new int [25]; }
// второй раз писать virtual не обязательно
virtual ~B (void) { delete [] p; }
int *p;
}

A *pB = new B;
// если бы конструктор A не был виртуальным, произошла бы утечка памяти -
// "delete [] p" в теле ~B так и не вызвался бы
delete pB;

Другой случаи использования виртуальных деструкторов для предотвращения утечки памяти при множественном наследовании.
Пример:
struct A {
...
};

struct B {
...
virtual ~B (void) {}
};

struct C: A, B {
...
};

B *pC = new C;
delete pC;

В этом примере созданный экземпляр класса C имеет следующую структуру, показанную на рисунке. mcb - запись о выделенной памяти под C. Если в классе B не будет объявлен виртуальный деструктор, при выполнении "delete pC", менеджер памяти не найдет записи mcb по адресу pC и ничего не освободит. Произойдет утечка.


Третий случай использования виртуальных деструкторов - придание виртуальности оператору delete, определенному локально. Язык C++ не является полным, поэтому приходится так неочевидно добиваться virtual operator delete.

Напоследок я рассмотрю возможность применения чисто виртуальных деструкторов. Умного примера, когда его нужно использовать, я привести не могу, однако приведу общие соображения по этому поводу. Пусть есть некий класс, который должен быть абстрактным - такая заготовочка. Причем этот класс не имеет чисто виртуальных функций. Дабы не писать пустую чисто виртуальную функцию, заведем в этом классе чисто виртуальный деструктор. Во-первых, это решение выглядит изящнее. Во-вторых, пользователи класса не будут обязаны определять чисто виртуальный метод - чисто виртуальные деструкторы, в отличие от функций, имеют тело. Но с другой стороны, что же это за абстрактный класс, не имеющих абстрактных методов? Если не хотим создавать его экземпляры, просто объявим конструктор protected... Не понятно. Оставлю этот вопрос открытым.

Итог.
Конструктор должен быть объявлен как виртуальный для:
  1. Вызова деструктора потомка при работе с объектом по указателю на предка.
  2. Корректной работы функций освобождения памяти при работе с объектом по указателю на предка при множественном наследовании.
  3. Виртуальности локально определенного оператора delete.
  4. Объявления класса абстрактным (используется чисто виртуальный деструктор). Этот пункт весьма сомнительный, ибо встретить на практике пример класса, не имеющего ни одной чисто виртуальной функции, но обязанного быть абстрактным весьма сложно.

вторник, 23 декабря 2008 г.

Nokia 8800 Sirocco

У моей нокии 8800 Sirocco стал барахлить динамик. Скорее всего, просто засорился. Но прочистить его оказалось не так просто - стильная металлическая конструкция слайдера казалась недоступный рукам непрофессионала. Доверять эту хрупкую модель отечественным мастерам СЦ желание никакого не было. Решил все сделать сам. В качестве инструкции использовал это видео по разборке.