前几天我做了一个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,什么都不会发生。我以为这是未定义的行为。所以我的问题是,这样做到底是不是一个好的做法?(或者是强制性的)
都有,检查 nullptr
和 指派 nullptr
之后 delete
不需要,因此在本例中不应该存在。
从 cppreference 关于 delete
(强调是我的)。
对于第一种(非数组)形式,表达式必须是指向一个对象类型的指针,或者是可隐式转换为这种指针的类类型,其值必须是: 要么为空 或指向一个新表达式创建的非数组对象的指针,或指向一个新表达式创建的非数组对象的基本子对象的指针。
[...]
如果表达式不是一个空指针,并且deallocation函数不是破坏性的删除函数(自C++20以来),那么删除表达式将为被破坏的对象,或者为数组中的每一个被破坏的元素(从数组的最后一个元素到第一个元素)调用destructor(如果有的话)。
调用 delete
关于 nullptr
什么也不做。
分配 nullptr
之后 delete
除非在你的例子中,在destructor中还有其他的代码来检查 m_v
因为他是 nullptr
或不。在destructor运行后 m_v
并不存在了。
PS:这真的不是风格的问题。没有机会做任何有用的事情的代码就不要写了。真的没有冒犯的意思,但是做检查的时候,要注意的是 nullptr
并将指针设置为 nullptr
可谓 货运邪教程序.