【问题标题】:Destructor for std::vector in a class类中 std::vector 的析构函数
【发布时间】: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


【解决方案1】:

除非您的类动态实例化它的成员或打开/创建外部资源,否则您不需要显式声明析构函数。默认的就可以了。

【讨论】:

  • 还有一个例外:析构函数必须是虚拟的。
猜你喜欢
  • 1970-01-01
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
  • 2012-07-10
  • 1970-01-01
  • 2015-12-17
  • 1970-01-01
相关资源
最近更新 更多