【发布时间】:2015-07-16 22:46:35
【问题描述】:
我们在某些功能中使用依赖于 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;
}
即使所有类都使用编译器的默认析构函数,没有虚拟析构函数的类层次结构是否也是一个问题?因此,我不能拥有一个可轻松复制的安全类层次结构是否正确?
【问题讨论】:
-
仅供参考,
f()的代码不应导致内存泄漏,因为delete会知道h指向CanData的实例。 -
@JoeSewell:实际上,由于缺少虚拟析构函数,它有UB。
-
@Lightness,即使根本没有虚函数,因此类是非多态的?
-
@SergeyTachenov:是的。阅读
[C++11: 5.3.5/3]。 -
哦,我明白了。事实上,即使是一个微不足道的析构函数也不是那么微不足道 - 它可以调用字段的析构函数,它可以做任何事情,因此将任何可能不调用析构函数(微不足道或不重要)的情况定义为 UB 实际上是有意义的。跨度>
标签: c++