Мы используем фреймворк, который полагается на memcpy в определенных функциях. Насколько я понимаю, я могу дать все, что тривиально можно скопировать в эти функции.
Теперь мы хотим использовать простую иерархию классов. Мы не уверены, можем ли мы иметь иерархию классов, которая приводит к тривиально копируемым типам из-за безопасного уничтожения. Код примера выглядит следующим образом.
class Timestamp; //...
class Header
{
public:
uint8_t Version() const;
const Timestamp& StartTime();
// ... more simple setters and getters with error checking
private:
uint8_t m_Version;
Timestamp m_StartTime;
};
class CanData : public Header
{
public:
uint8_t Channel();
// ... more setters and getters with error checking
private:
uint8_t m_Channel;
};
Базовый класс используется в нескольких аналогичных подклассах. Здесь я опустил все конструкторы и деструкторы. Таким образом, классы тривиально копируются. Я полагаю, однако, что пользователь может написать код, который приводит к утечке памяти следующим образом:
void f()
{
Header* h = new CanData();
delete h;
}
Правильно ли, что иерархия классов без виртуального деструктора является проблемой, даже если все классы используют деструктор по умолчанию для компилятора? Правильно ли, что я не могу иметь безопасную иерархию классов, которая тривиально копируется?