为什么要明确清除 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() 类型的成员变量进行 vectorvector 析构函数将在调用时对 .clear() 进行 vector

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

delete p_;

不需要先测试p_ != NULL是否是delete NULL;,因为p_ = NULL被定义为no-op。 delete d 之后也不需要设置 p_ ,因为 delete 在它所属的对象被销毁后不能再合法地访问。

也就是说,您应该很少需要在 C++ 代码中使用 boost::scoped_ptr。您应该更喜欢使用 Scope-Bound Resource Management (SBRM,也称为 Resource Acquisition Is Initialization) 来自动管理资源生命周期。

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

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

10-12 20:37