对于以下问题,你会接受什么样的答案
“描述从构造函数和析构函数抛出异常的过程和/或陷阱”(C++/C#/java)
对于声称在这些语言中拥有多年经验的候选人(如果他错过了这一点,你几乎肯定不想要他),你认为这方面的知识量是必不可少的。
对于以下问题,你会接受什么样的答案
“描述从构造函数和析构函数抛出异常的过程和/或陷阱”(C++/C#/java)
对于声称在这些语言中拥有多年经验的候选人(如果他错过了这一点,你几乎肯定不想要他),你认为这方面的知识量是必不可少的。
如果有人说他们有 2 年的 C++ 经验,但不了解构造函数/析构函数和异常的来龙去脉,这不会阻止我雇用他们。这是一种易于学习的知识类型,由一些简单的规则组成。
我当然希望他们拥有这些知识,但没有它并不会使他们成为一个糟糕或懒惰的程序员。我曾与优秀的 C++ 程序员一起工作,他们大部分时间都在老式 COM 和 HRESULT 领域度过。这大量使用了 C++,但实际上消除了 C++ 异常。他们没有必要也没有理由去学习它。一旦我们将异常引入代码库,大约需要 15 分钟才能让每个人都参与到构造函数/析构函数问题上。
我宁愿用面试来测试一个人解决问题的能力,也不愿看看他们是否了解 C++ 特定部分的来龙去脉。教它很容易,但教解决问题却很难。
他必须知道,在 C++ 中,只有完全构造的对象才会调用析构函数。所以下面的类在 C++ 中是泄漏的:
class Leaky {
public:
Leaky() { a = new char[100]; b = new char[100]; }
~Leaky() { delete a; delete b; }
private:
char* a;
char* b;
};
如果在执行b = new char[100]时抛出异常, 则不会调用 Leaky::~Leaky() 并且您有内存泄漏。
怎么样(我指的是 C++):如果一个对象在其构造函数中抛出,则该对象可能处于未定义状态。析构函数不会运行。这可能会导致内存和句柄泄漏甚至死锁。
此外,在 C++ 中,如果一个异常正在展开堆栈,并且从析构函数中抛出另一个异常,则程序将终止(或者,准确地说,调用 terminate_handler)。
您不能将构造函数代码放在 C# 中的 try-catch-finally 块中吗?这样,如果出现问题,finally 部分中的代码将释放资源。
这是一个边缘问题。例如,一个称职的开发人员可能会在某个地方发现这是一个坏主意,并避免它们。坦率地说,我会在这方面做的最好的事情是,它可能会使对象处于部分构造的状态,所以通常最好避免它。”我希望他们详细说明他们做了什么,这是一个好的做法,为什么。