【发布时间】:2020-04-25 21:42:32
【问题描述】:
前几天我进行了一次 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,则不会发生任何事情。我希望它是未定义的行为。所以我的问题是这样做的好习惯吗? (或者是强制性的)
【问题讨论】:
-
好吧,我想说这是编码风格的一个例子。
-
delete[] m_v;正确处理 nullptr 情况。设置m_v = nullptr;没有实际价值,因为该对象即将成为非对象......但是,我在我的开发调试代码中这样做,因为它有助于暴露悬空指针。 (并不是说我会有一个悬空指针。) -
你的面试官是对的。这是完全没用的。在其他情况下,这可能不是,但在这种情况下,它是 100% 没用的。在一个定义良好的 C++ 程序中,从逻辑上讲不可能得到
delete将上面代码设置为nullptr值的指针的结果。因此,这在逻辑上是没有用的。同样,此声明明确且具体地适用于这个确切的用例,并且仅适用于这个确切的用例,而不适用于其他任何情况。 -
您的 dtor 在您的示例中是私有的。所以,你不能定义
A a;。您只能定义A *a;。在这种情况下,您不能在a上调用 delete,因为 dtor 是私有的。
标签: c++ c++11 destructor nullptr