【发布时间】:2016-11-04 07:40:59
【问题描述】:
如果类中有std::vector,我们是否需要定义析构函数?
如果我为基类和派生类都定义了空的虚析构函数,会不会出现内存泄漏?
class fruit{
public:
uint32_t num_seed;
//virtual ~fruit(void){}
} ;
class spiky_apple: public fruit{
typedef std::vector<uint32_t> vector;
public:
vector spikes;
void bomb(void);
//spikes.reserve(2000)
//and then spikes[i] = xyz.
//virtual ~spiky_apple(void){}
} ;
【问题讨论】:
-
不,编译器生成的析构函数在这种情况下就足够了。
-
也许可以,但不适用于您问题中的
vector。 -
不知何故,当我迭代 i 时,spikes[i] = xyz 比首先获取指向第零个成员的指针(比如说是 ptr)要慢,然后 ptr[i] = xyz。使用 intel c 编译器的 -O3 优化,比率为 3.5 秒:3 秒。
-
非常棒。我在想我是否会被内存泄漏轰炸。
-
是的!这是一个多态类,您需要基类中的虚拟析构函数,最好显式覆盖它并在派生类中使其成为虚拟以进行扩展,否则在删除基类时将调用水果析构函数而不是 spiky_apple 析构函数指针。在这个特定示例中没有问题,但随着代码的增长,它很容易成为缺陷。
标签: c++ destructor stdvector