2010-06-10 2 views
12

Допустим, есть указатель базового класса, который указывает на объект базового класса:C++ интервью вопрос указатели с участием класса

baseclass *bptr; 
bptr= new baseclass; 

теперь, если я сделать

bptr= new derived; 

что здесь проблема?

+2

У вас есть это или декларация классов? – Nikko

+8

Я собираюсь пойти с непоследовательной схемой именования. Если у вас 'baseclass' логически, у вас также будет' производный класс'. Кроме того, интервал всевозможных ошибок. * Все знают, что звездочка принадлежит типу, а не переменной. –

+4

@Dennis Логически звездочка относится к типу, но синтаксически относится к переменной. Попробуйте это и скажите мне, является ли ptr2 указателем или нет: 'MyClass * ptr1, ptr2;'. –

ответ

16

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

+0

Это был мой ответ ... на самом деле ... но он намекнул мне на любую другую проблему, которую я мог бы выяснить. – Vijay

+0

Нет другой проблемы. – Blindy

+0

Можно сказать, что производное должно быть фактически получено из базы. – ckv

0

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

1

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

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

0

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

7

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

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

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

0

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

0

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

5

Если на вашем месте я бы вернуться и попросить вашего интервьюера пару вопросов:

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

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

Arpan

+0

+1, Иногда вопросы также могут быть ответы .. :) – liaK

2

что здесь проблема?

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

0

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

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

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