面试问题的可接受答案

时间:2009-04-01 12:42:36

标签: exception constructor destructor

您接受以下问题会得到什么样的答案

“描述从构造函数和析构函数中抛出异常的过程和/或陷阱”(C ++ / C#/ java)

对于声称拥有多年这些语言经验的候选人(如果他错过了,你几乎肯定不想要他),你认为对此有多少知识是必不可少的。

6 个答案:

答案 0 :(得分:9)

如果有人说他们有2年的C ++经验,但不了解构造函数/析构函数和异常的来龙去脉,那么就不会阻止我雇用它们。这是一种易于学习的知识类型,由一些简单的规则组成。

我当然希望他们拥有这些知识但不会让他们成为一个坏或懒惰的程序员。我和优秀的C ++程序员一起工作,他们大部分时间都在旧学校的COM和HRESULT土地上度过。这大量使用C ++但实际上消除了C ++异常。他们没有必要或没有理由学习它。一旦我们将异常引入代码库,花了大约15分钟让每个人都参与构造函数/析构函数问题。

我宁愿使用面试来测试一个人解决问题的能力,而不是看他们是否知道C ++特定部分的来龙去脉。这很容易教,但很难教解决问题。

答案 1 :(得分:4)

他必须知道在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(),并且内存泄漏。

答案 2 :(得分:2)

这个怎么样(我指的是C ++):如果一个对象在其构造函数中抛出,该对象可能会处于未定义状态。析构函数不会运行。这可能会导致内存和处理泄漏,甚至可能导致死锁。

答案 3 :(得分:1)

此外,在C ++中,如果异常正在展开堆栈,并且从析构函数抛出另一个异常,程序将终止(或者,确切地说,调用terminate_handler)。

答案 4 :(得分:0)

你不能把构造函数代码放在C#的try-catch-finally块中吗?这样,如果出现问题,finally-section中的代码将释放资源。

答案 5 :(得分:0)

这是一个边缘问题。例如,一个称职的开发人员可能已经在线路的某处找到了一个坏主意,并且只是避免它们。坦率地说,我在这方面所做的最好的事情是,好吧,它可能会使对象处于部分构造的状态,所以通常最好避免它。“我更愿意让他们详细说明他们做的是什么良好的做法,以及为什么。