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

标签 c++

为什么要显式清除一个 vector 成员变量(在 dtor 中的 on(请参阅下面的代码)。清除 vector 的好处是什么,即使它会在最后一行之后被销毁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 类型的成员变量。 vector 析构函数在调用时将 .clear() vector

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

delete p_;

不需要先测试是否p_ != NULL,因为delete NULL;被定义为空操作。 delete 之后也不需要设置 p_ = NULL 因为 p_ 在对象之后不能再被合法访问它是一个成员被销毁。

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

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

关于c++ - 我是否需要在析构函数中使成员变量无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4236736/

相关文章:

c++ - mbstowcs_s 的 Microsoft 实现是线程安全的吗?

c++ - gsl::suppress 整个包含语句

c++ - 旋转框列表,仅显示已更改的值

c++ - 'cin'和 'getline'问题的真正解决方案

c++ - I/O 信号和处理程序

c++ - gtkmm 4 FileChooserNative 代码示例

c++ - 无效的指针转换 C++

c++ - QNetworkAccessManager没有完成信号

c++ - 使用 Cg 渲染到屏幕外帧缓冲区对象的示例

c++ - 删除字符并将它们附加到字符串的末尾 (C++)