Вопрос звучал так: почему в этом коде течёт память. Может троллили и она не течёт, но когда я ответил, они радостно приняли ответ, показав что его и ждали и поехали дальше.
T() исключений не кидает, память внутри не выделяет.
f() память внутри не выделяет, возвращает int, но может кинуть исключение.
std::shared_ptr<T> t(new T( f() ) );
Я ответил такой бред: перед конструкированием объекта (вызовом T()) должна быть выделена память. Тогда возможна последовательность: malloc (от new), f(), T(). Если f() кинуло исключение, то выделенная память, в которой должен конструироваться объект, никем не освободится. Но это лютый бред, поскольку, вроде как если в ходе new летит исключение, то память, которую сам оператор new выделил, гарантированно освободится обратно. Да, исключение полетело не из конструктора T(), а при вычислении аргументов для передачи в конструктор, но я всегда думал что в случае оператора new это всё то же самое, как если бы полетело из конструктора.
Короче, я стал сомневаться в том, что собеседующий был вменяем. Течёт скорее всего у него где-то в другом месте.