C ++析构函数约定

Zeenobit

我看到很多代码,例如下面的C ++示例,通常建议将其作为惯例:

class Foo
{
public:

    Foo()
    {
        bar = new int[100];
        size = 100;
    }

    // ... copy/assignment stuff ...

    ~Foo()
    {
        if (bar) // <--- needed?
        {
            delete[] bar;
            bar = nullptr; // <--- needed?
        }

        size = 0; // <--- needed?
    }

private:

    int* bar;
    int size;
};

对我来说,这三条语句if (bar) { ... }bar = nullptr;以及size = 0;是多余的,原因有二:

  1. delete nullptr; 是绝对安全的,它什么也没做。
  2. 如果该对象被销毁,内存被释放,我不应该担心安全设置bar,以nullptrsize为0。

这些理由正确吗?这些说法真的多余吗?如果是这样,为什么人们会继续使用并提出建议?我希望看到一些可能的问题,可以通过保留此约定来解决。

陆迁格里戈尔

没错,这些并不需要,而且某些编译器仍会对其进行优化。

但是,人们通常这样做的原因是为了帮助发现问题。例如,假设您不将指针设置为null。该对象已被破坏,但是随后您错误地尝试访问(曾经是)指针。由于运行时可能不会清除它,因此您仍然会在此处看到有效的内容。这仅从调试中有价值,并且仍然是未定义的行为,但有时会有所回报。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章