Коммент по поводу пункта 2.
P>2. "goto в конец функции":
P>.....
P>
P>Плюсы:
P>
P>код не уползает вправо
P>
P>Минусы:
P>
P>нелюбимый многими goto 
Его не любят за примение не по делу. Если же его применять с умом, то ничего в нем крамольного нет.
P>при добавлении в цепочку новых вызовов можно легко забыть добавить деструктор или переход на нужную метку;
Чушь. Суть данного способа в том, что программа последовательно захватывает ресурсы (создает объекты), а потом освобождает их в обратном порядке. Если ты добавляешь захват нового ресурса, то все, что нужно сделать — вставить код его осводождения в нужное место в цепочке деструкторов.
P>если необходимо выйти из функции не через конечный return, то приходится вручную вызывать все деструкты;
Еще бОльшая чушь. Просто должна быть метка перед началом блока деструкторов. При необходимости выйти через конечный return выполняется переход на эту метку.
P>
Подобная схема применяется в коде ядра linux-а, и никто вроде особо не жаловался...
P>3. "выходим сразу":
P>.................
P>
P>Плюсы:
P>
P>код не уползает вправо
P>
P>Минусы:
P>
P>при добавлении в цепочку новых вызовов приходится добавлять деструкторы как минимум в 2 места;
Вот уж тут точно можно забыть что-то освободить...
P>
Остойный вариант. Годится только для небольшого числа используемых "ресурсов" (один-два)
P>4. "выделение деструкторов в отдельный блок":
P>..........
P>
То же самое, что и вариант 3. Чуть облагороженный.