为什么人们想要明确地清除一个向量成员变量(在dtor中为on)(请参见下面的代码).清除向量有什么好处,即使它会在dtor代码的最后一行之后被销毁被执行?
class A
{
~A()
{
values.clear();
}
private:
std::vector < double > values_;
};
Run Code Online (Sandbox Code Playgroud)
关于以下代码的类似问题:
class B
{
~B()
{
if (NULL != p)
{
delete p_;
p_ = NULL;
}
}
private:
A * p_;
};
Run Code Online (Sandbox Code Playgroud)
由于dtor无法被调用两次,为什么要取消p_呢?
Jam*_*lis 11
在类中A,绝对没有理由在析构函数中.clear()使用vector-type成员变量.该vector析构函数将.clear()在vector被调用时.
在类中B,清理代码可以简单地写成:
delete p_;
Run Code Online (Sandbox Code Playgroud)
没有必要先测试是否p_ != NULL因为delete NULL;被定义为无操作.p_ = NULL在你删除之后也没有必要设置delete它,因为p_在它成为成员的对象被销毁之后再也无法合法访问.
也就是说,您应该很少需要delete在C++代码中使用.你应该更喜欢使用范围,结合资源管理(SBRM,也被称为资源获取就是初始化)来自动管理资源的寿命.
在这种情况下,您可以使用智能指针. boost::scoped_ptr和std::unique_ptr(来自C++ 0x)都是不错的选择.与使用原始指针相比,它们都没有任何开销.此外,他们都禁止生成隐式声明的拷贝构造函数和拷贝赋值运算符,通常是你想要的东西,当你有一个成员变量是一个指向一个动态分配的对象.