NULL在类析构函数中

时间:2011-02-13 15:15:50

标签: c++ class null destructor explicit

  

可能重复:
  Is it worth setting pointers to NULL in a destructor?

在析构函数中将指针(分配堆内存)设置为NULL是否毫无意义?

class SampleClass
{
    public:
        SampleClass( int Init = 0 )
        {
            Value = new int( Init );
        }

        ~SampleClass( void )
        {
            delete Value;
            Value = NULL; // Is this pointless?
        }

        int *Value;
};

关于课程的主题,我应该何时使用explicit关键字?

4 个答案:

答案 0 :(得分:5)

是。这是毫无意义的,因为对象是在被破坏的过程中。 一旦它被摧毁,就无法到达指针。

答案 1 :(得分:4)

是的,在析构函数的最末端将指针设置为NULL是没有意义的,因为一旦离开析构函数它就不再存在了。

如果要避免对类类型进行隐式转换,请使用explicit关键字。 : - )

例如,如果MyClass的构造函数包含int和函数f(const MyClass&),则可以将f称为

f(42)

f(MyClass(42))

如果使构造函数显式化,则只有后者才有效。它可以帮助您避免一些不必要的隐式转换。

答案 2 :(得分:1)

最好将指针设置为NULL。

如果代码中的其他位置删除SampleClass实例然后访问Value(使用指向同一实例的另一个指针),您将知道出现问题,因为程序将在NULL取消引用时崩溃(所以你会知道你是访问已删除的对象)。

否则,您可以继续使用已删除的对象,并在稍后(当内存被另一个对象覆盖时)注意到该错误。这些问题通常很难调试。

答案 3 :(得分:1)

这并非毫无意义。虽然从理论上讲,这个值永远不会被再次访问,但如果任何其他的恶作剧开始发生,将它设置为NULL可能会对你有所帮助。