需要用nullptr初始化吗?

问题描述 投票:1回答:1

前几天我做了一个C ++的面试。我必须做代码审查...

这不是面试时的例子,但它是我的问题的一个很好的例子。

class A{
    public:
    A(int n) : m_n{n}, m_v{new char[n]}{
    //do something
    }
    ~A(){
        if(m_v != nullptr)
        {
            //here I said it should be checked and initialized with nullptr
            delete []m_v;
            m_v = nullptr;
        }
    }
    private:
    int m_n;    
    char *m_v;

};

面试官说,这样做是没有用的。如果你删除nullptr,什么都不会发生。我以为这是未定义的行为。所以我的问题是,这样做到底是不是一个好的做法?(或者是强制性的)

c++ c++11 destructor nullptr
1个回答
3
投票

都有,检查 nullptr 指派 nullptr 之后 delete 不需要,因此在本例中不应该存在。

cppreference 关于 delete (强调是我的)。

对于第一种(非数组)形式,表达式必须是指向一个对象类型的指针,或者是可隐式转换为这种指针的类类型,其值必须是: 要么为空 或指向一个新表达式创建的非数组对象的指针,或指向一个新表达式创建的非数组对象的基本子对象的指针。

[...]

如果表达式不是一个空指针,并且deallocation函数不是破坏性的删除函数(自C++20以来),那么删除表达式将为被破坏的对象,或者为数组中的每一个被破坏的元素(从数组的最后一个元素到第一个元素)调用destructor(如果有的话)。

调用 delete 关于 nullptr 什么也不做。

分配 nullptr 之后 delete 除非在你的例子中,在destructor中还有其他的代码来检查 m_v 因为他是 nullptr 或不。在destructor运行后 m_v 并不存在了。

PS:这真的不是风格的问题。没有机会做任何有用的事情的代码就不要写了。真的没有冒犯的意思,但是做检查的时候,要注意的是 nullptr 并将指针设置为 nullptr 可谓 货运邪教程序.

© www.soinside.com 2019 - 2024. All rights reserved.