В моем проекте я нашел приведенный ниже код. В классе XYZ я не понимаю необходимости использования std::unique_ptr в абстрактном классе ABC. ABC не имеет элементов данных; а класс Derived имеет только член std::function. Я думаю, что когда объект XYZ уничтожается, уничтожается и my_map_. Поскольку значения my_map_ являются указателями на функции, я не думал, что сами функции нуждаются в освобождении. Что было бы неправильно, если бы объект XYZ вышел из области видимости и карта была уничтожена без использования преимущества RAII std::unique_ptr? Если Derived имеет некоторые элементы данных, отличные от std::function, тогда я вижу ценность наличия интеллектуального указателя в my_map_.
Может ли быть так, что этот уникальный указатель необходим, потому что функции работают с сообщениями protobuf или по более простой причине?
Код: Выделить всё
#include
class ABC {
public:
virtual void DoStuff(google::protobuf::Any& message) = 0;
virtual ~ABC() = default;
};
template
class Derived : public ABC {
public:
explicit Derived(std::function my_function)
: my_function_(my_function) {}
void DoStuff(google::protobuf::Any& message) {
T protoMessage;
// ... UnpackTo usage with error handling
}
my_function_(protoMessage);
}
private:
std::function my_function_;
};
class XYZ {
public:
explicit XYZ(const std::string& name);
virtual ~XYZ();
// ...
protected:
std::map my_map_;
std::string name_;
};
Кстати, я заметил, что у Derived нет деструктора по умолчанию. Возможно, мне стоит добавить это. Я не думаю, что это необходимо в коде как есть, но, возможно, это полезно для будущего обслуживания.
Подробнее здесь:
https://stackoverflow.com/questions/798 ... -has-a-std