Exception 面试问题的可接受答案

Exception 面试问题的可接受答案,exception,constructor,destructor,Exception,Constructor,Destructor,对于以下问题,你会接受什么样的答案 “描述从构造函数和析构函数抛出异常的过程和/或陷阱”(C++/C#/java) 这方面的知识,对于一个声称拥有这些语言的经验的候选人(如果他错过了,你几乎肯定不需要他),你认为是必要的。 < P>这(这是指C++):如果一个对象在其构造函数中抛出,对象可能处于未定义状态。析构函数将不会运行。这可能导致内存和处理泄漏,甚至可能导致死锁,在C++中,如果一个异常正在解开堆栈,另一个异常从析构函数中抛出,程序将终止(或者确切地说,调用TealTyx处理程序)。.您不

对于以下问题,你会接受什么样的答案

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


这方面的知识,对于一个声称拥有这些语言的经验的候选人(如果他错过了,你几乎肯定不需要他),你认为是必要的。

< P>这(这是指C++):如果一个对象在其构造函数中抛出,对象可能处于未定义状态。析构函数将不会运行。这可能导致内存和处理泄漏,甚至可能导致死锁
class Leaky {
public:
    Leaky() { a = new char[100]; b = new char[100]; }
    ~Leaky() { delete a; delete b; }
private:
   char* a;
   char* b;
};

如果在执行B=新char(100)时抛出异常,则不调用Curry::~(CurryYe)(),并且内存泄漏。

< P>,在C++中,如果一个异常正在解开堆栈,另一个异常从析构函数中抛出,程序将终止(或者确切地说,调用TealTyx处理程序)。.

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

这是一个边缘问题。例如,一个有能力的开发人员可能会在开发过程中的某个地方发现这是一个坏主意,而只是避开它们。坦白地说,我在这方面做得最好的是,它可能会让对象处于部分构造的状态,所以通常最好避免它。“我更愿意让他们详细说明他们做了什么,这是一个很好的实践,为什么?

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

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


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

至少在C++中,如果从一个Cor抛出一个异常,这个对象就永远不会出现(这就是为什么DoT没有被调用)——它不能处于未定义的状态。但是它不释放它可能分配的资源,例如子对象的Malc。这些对象仍然存在并定义partent对象状态的一部分。因此,即使对象不存在,它的一部分状态仍然是这样,它肯定是未定义的(泄露)。但是,绝对没有能力的C++程序员会编写这样的代码:-当然,没有能力的C++程序员正在捕获异常吗?我以为你应该让他们返回操作系统,这样可以释放你的内存;)(这里是四月一日)@Adam:如果你需要像上面这样的类,你应该使用智能指针。如果你尝试玩异常处理,你会得到非常混乱的代码。假设C++、C和java基本上是等价的,那么任何关于抛出异常的问题都是一个坏的假设。首先,我会重新考虑把这个当作一个面试问题。我的意思是让候选人从这一组中选择一种语言,他在这方面很熟悉和回答。从构造函数中抛出一个异常并不是一个坏主意——在C++中,如果在构建过程中发生错误,最好的做法是。我希望通过将可能抛出一个独立的方法(In)的方法引入到整个对象中来避免整个问题。这将是一个非常非常坏的想法,与公认的C++智慧相反。我还在学习C++,是的,我认为这是基本的知识。