Может ли прерывание прервать выполнение конструктора / деструктора в С++?
Да, конечно может, как и любой другой код, явно не защищённый от прерываний.
нужно ли в конструкторах / деструкторах защищать код критическими секциями?
Нужно защищать любое состояние, к которому может обращаться код из разных контекстов выполнения -- например из разных потоков или из потока и обработчика прерывания. В ядре linux (где разных типов контекста много и разных способов синхронизации тоже много) есть
руководство, что и когда использовать.