在析构函数中将指针(分配堆内存)设置为NULL
是否毫无意义?
class SampleClass
{
public:
SampleClass( int Init = 0 )
{
Value = new int( Init );
}
~SampleClass( void )
{
delete Value;
Value = NULL; // Is this pointless?
}
int *Value;
};
关于课程的主题,我应该何时使用explicit
关键字?
答案 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可能会对你有所帮助。