2009-04-01 2 views
0

Какие ответы вы могли бы принять на следующий вопросПриемлемые ответы на интервью вопрос

«Опишите процесс и/или ловушкой бросать исключения из конструктора и деструкторов» (C++/C#/Java)

Какое количество знаний об этом вы считаете существенным, поскольку кандидат, претендующий на многолетний опыт работы на любом из этих языков (если он этого пропустит, вы почти наверняка не хотите его).

+0

Предполагая, что C++, C# и Java в основном эквивалентны в отношении любого вопроса о бросании исключений, это плохое предположение для начала. Я бы передумал использовать это в качестве вопроса интервью в первую очередь. –

+0

Я хотел, чтобы кандидат выбрал один язык из этой группы, с которой он знаком и отвечает в этом контексте. – ripper234

ответ

2

Как об этом (я имею в виду C++): если объект бросает внутри своего конструктора, объект может быть оставлен в неопределенном состоянии. Деструктор не будет работать. Это может привести к потере памяти и устранению утечек, возможно, даже к взаимоблокировкам.

+0

По крайней мере, на C++, если исключение выбрано из ctor, объект никогда не возникает (поэтому dtor не вызывается) - поэтому он не может находиться в неопределенном состоянии. – 2009-04-01 12:49:17

+0

Но он не освобождает ресурсы, которые он мог бы выделить, например, malloc дочерних объектов.Эти объекты все еще существуют и определяют часть состояния объекта partent. Поэтому, несмотря на то, что объект не существует, часть его состояния все еще выполняется, и он уверен, что он не определен (просочился). –

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; 
}; 

Если исключение при выполнении Ь = новый символ [100] то Дырявый :: ~ Дырявый() не вызывается, и у Вас есть утечка памяти.

+0

Но, конечно, ни один компетентный программист на С ++ никогда не писал бы такой код :-) – 2009-04-01 12:52:26

+0

Неужели ни один компетентный программист на C++ не ловит исключения? Я думал, что вы должны позволить им вернуть ОС, чтобы он мог освободить вашу память;) (* April First Here *) –

+2

@Adam: Если вам когда-нибудь понадобится класс, подобный выше, вы должны использовать умный указатель. Если вы попытаетесь сыграть с обработкой исключений, вы получите чрезвычайно грязный код. – sharptooth

1

Кроме того, на C++, если исключение разворачивает стек, а другое исключение выбрано из деструктора, программа прекратит (или, точнее, вызовет terminate_handler).

+0

Да, я считаю, что это важное знание. – ripper234

0

Не можете ли вы поместить код конструктора в блок try-catch-finally в C#? Таким образом, если что-то пойдет не так, код в окончательном разделе освободит ресурсы.

0

Это своего рода вопрос о грани. Например, компетентный разработчик, вероятно, понял, что это плохая идея где-то вдоль линии, и просто избегает их. Честно говоря, лучшее, что я сделал бы на этом, это что-то вроде этого, ну, может быть, объект останется в частично сконструированном состоянии, поэтому лучше избегать этого. «Я бы предпочел, чтобы они подробно рассказывали о том, что они делают хорошая практика и почему.

+0

Неплохое представление об исключении из конструктора - на C++ это лучшая практика, если во время построения возникает ошибка. – 2009-04-01 13:02:48

+0

Тем не менее, я бы предпочел избежать всей проблемы, поставив действия, которые могли бы вызвать отдельный метод init(), который можно вызвать после создания объекта. –

+0

Это была бы очень, очень плохая идея и противоречит принятой мудрости С ++. – 2009-04-01 13:20:09

9

Если кто-то сказал, что у них 2 года опыта работы на C++, но он не понимает входы и выходы конструкторов/деструкторов и исключений, это не помешает мне нанять их. знаний, которые могут быть легко изучены и состоят из нескольких простых правил.

Мне бы очень хотелось, чтобы они обладали этим знанием, но не имея его, это не делает их плохим или ленивым программистом. Я работал с отличными программистами на С ++ которые большую часть времени проводили в старой школе COM и HRESULT. сильно использует C++, но практически исключает исключения C++. Нет необходимости или повода для их изучения. Как только мы ввели исключения в базу кода, потребовалось около 15 минут, чтобы все на борт с проблемой конструктора/деструктора.

Я бы предпочел использовать интервью, чтобы проверить навыки решения проблем с людьми, а не видеть, знают ли они об особенностях конкретной части C++. Это так легко научить этому, но так трудно научить решению проблем.

Смежные вопросы