为什么要明确清除 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;
,因为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/