std::function
имеет деструктор, который удаляет все ресурсы, которыми он управлял, если они есть. Эта строка:
m_func = nullptr; // Is this required?
никогда не требуется. Деструкторы членов класса вызываются автоматически, и если нет, то присвоение nullptr
никогда не будет «правильным». Если бы m_func
был указателем, вы бы потеряли значение указателя и возможность удалить то, на что он указывает.
Немного странно, что в официальной документации по адресу ...
From cppreference на std::function
s деструкторе не упоминается, что он умный :
Уничтожает экземпляр std :: function. Если std :: function не пуста, ее цель также уничтожается.
В целом можно с уверенностью предположить, что класс очищает любые ресурсы, которыми он управляет, в своем детрукторе, в противном случае он может считаться сломанным. Очистка ресурсов в деструкторах - это не что-то новое в интеллектуальных указателях. Интеллектуальные указатели применяют RAII, который всегда присутствует в C ++, только к указателям для инкапсуляции управления динамически выделяемой памятью.