Требуется ли std::unique_ptr для абстрактного класса, производный класс которого имеет только член std::function и не имC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Требуется ли std::unique_ptr для абстрактного класса, производный класс которого имеет только член std::function и не им

Сообщение Anonymous »

В моем проекте я нашел приведенный ниже код. В классе 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»