加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 我是否需要在析构函数中使成员变量无效?

发布时间:2020-12-16 05:34:03 所属栏目:百科 来源:网络整理
导读:为什么人们想要明确地清除一个向量成员变量(在dtor中为on)(请参见下面的代码).清除向量有什么好处,即使它会在dtor代码的最后一行之后被销毁被执行? class A{~A(){ values.clear();}private: std::vector double values_;}; 关于以下代码的类似问题: class
为什么人们想要明确地清除一个向量成员变量(在dtor中为on)(请参见下面的代码).清除向量有什么好处,即使它会在dtor代码的最后一行之后被销毁被执行?
class A
{
~A()
{
   values.clear();
}

private: 
  std::vector < double > values_;
};

关于以下代码的类似问题:

class B
{
~B()
{
   if (NULL != p)
   {
       delete p_;
       p_ = NULL;
   }
}

private: 
  A * p_;
};

由于dtor无法被调用两次,为什么要取消p_呢?

解决方法

在A类中,绝对没有理由将.clear()析构函数中的vector-type成员变量.向量析构函数将在调用时将.clear()向量.

在B类中,清理代码可以简单地写成:

delete p_;

没有必要先测试p_!= NULL是否因为删除NULL;被定义为无操作.在删除p_ = NULL之后也没有必要设置p_ = NULL,因为在它作为成员的对象被销毁之后,不能再合法地访问p_.

也就是说,您应该很少需要在C代码中使用delete.您应该更喜欢使用范围限制资源管理(SBRM,也称为资源获取是初始化)来自动管理资源生命周期.

在这种情况下,您可以使用智能指针. boost :: scoped_ptr和std :: unique_ptr(来自C 0x)都是不错的选择.与使用原始指针相比,它们都没有任何开销.此外,它们都抑制了隐式声明的复制构造函数和复制赋值运算符的生成,当您有一个成员变量作为动态分配对象的指针时,这通常是您想要的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读