Подтвердить что ты не робот

Вопрос с С++ интервью с указателями класса

Предположим, что есть указатель базового класса, который указывает на объект базового класса:

baseclass *bptr;
bptr= new baseclass;

теперь, если я do

bptr= new derived;

в чем проблема?

4b9b3361

Ответ 1

Очевидным ответом является то, что вы протекаете исходный объект базового класса.

Ответ 2

Помимо очевидной утечки памяти, это зависит от определения baseclass и derived, некоторые из проблем могут быть:

  • derived не публично выводится из baseclass (если это ужасный вопрос, который нужно задать в интервью)
  • baseclass не имеет виртуального деструктора (в этом случае он небезопасен для delete bptr;)

Ответ 3

Если бы я был вами, я бы повернул назад и задал вашему собеседнику пару вопросов:

  • Вы уверены, что это единственный доступный фрагмент кода, и в этом случае мой ответ дает обоснованное предположение, не более того.
  • Есть ли какая-то схема памяти mgmt для базового класса и производная? В этом случае нам нужно заглянуть в оператор новых определений, которые не предусмотрены.
  • Если нет памяти mgmt, то являются базовыми или производными типами интеллектуального указателя, которые ссылаются на подсчет ссылок? В этих случаях нет утечек.
  • Если нет умных типов, то, конечно, это выглядит как утечка памяти.

И, при наличии виртуальных деструкторов и т.д., только если у вас есть определения классов. Возможно, интервьюер тайно ищет ясновидящих типов.

Арпан

Ответ 4

в чем проблема?

Если ответ ( "утечка памяти" ) не принят, проблема заключается либо в вопросе, либо у интервьюера;)

Ответ 5

В первой строке вы указали указатель. Во второй строке вы указываете ссылку в памяти. в строке 3 вы даете IT другую ссылку в памяти.

первая ссылка, которую вы указали на указатель, просочилась... вы никогда не сможете вернуть ее.

Ответ 6

Он пытался добраться до проблемы Circle Ellipse? Если производная является специализацией базового класса, некоторые общедоступные методы в базовом классе могут больше не иметь значения, например. если Circle получен из Ellipse, а Ellipse имеет метод stretch(), который растягивает эллипс по одной оси, что вы делаете, когда метод вызывается на экземпляр Circle?

Ответ 7

Вы переназначаете указатель, не освобождая память, выделенную для предыдущего объекта. Это может привести к утечке памяти, если ни один из объектов не сохранил значение bptr перед тем, как переназначить его.

Ответ 8

Имеет ли baseclass виртуальный деструктор? Если нет, это может быть плохо (в дополнение к очевидной утечке).

Ответ 9

Единственная проблема возникает, если деструктор класса не определен как виртуальный. В этом случае это приведет к утечке памяти

Ответ 10

Существует проблема без синтаксиса, но вы теряете адрес экземпляра "базового класса", назначая новое значение переменной "bptr". Это приводит к утечке памяти, поскольку адрес первого инстанцированного класса теряется.

Ответ 11

Я бы ответил на этот вопрос интервью так:

Из ограниченного фрагмента кода, при условии, что будет ясно, что утечка памяти произойдет, когда мы назначим указатель на экземпляр этого производного класса, поскольку у нас нет других указателей, обращающихся к базовому объекту. Однако невозможно сказать больше о фрагменте кода, не видя определения обоих классов, и видя связь между двумя классами.