Допустим, есть указатель базового класса, который указывает на объект базового класса:C++ интервью вопрос указатели с участием класса
baseclass *bptr;
bptr= new baseclass;
теперь, если я сделать
bptr= new derived;
что здесь проблема?
Допустим, есть указатель базового класса, который указывает на объект базового класса:C++ интервью вопрос указатели с участием класса
baseclass *bptr;
bptr= new baseclass;
теперь, если я сделать
bptr= new derived;
что здесь проблема?
Очевидным ответом является то, что вы протекаете исходный объект базового класса.
Вы переназначаете указатель, не освобождая память, выделенную для предыдущего объекта. Это может привести к утечке памяти, если ни один из них не сохранил значение bptr
, прежде чем переназначить его.
В первой строке вы указали указатель. Во второй строке вы указываете ссылку в памяти. в строке 3, вы даете IT другую ссылку в памяти.
первая ссылка, которую вы указали на указатель, просочилась ... вы никогда не сможете ее вернуть.
Есть ли у baseclass
виртуальный деструктор? Если нет, это может быть плохо (в дополнение к очевидной утечке).
Кроме очевидной памяти утечка зависит от определения baseclass
и derived
некоторых проблем могут быть:
derived
публично не производное от baseclass
(если так это ужасный вопрос, чтобы спросить в интервью)baseclass
не имеет виртуальный деструктор (в этом случае это небезопасно delete bptr;
)он пытался добраться до Circle Ellipse problem? Если производная является специализацией базового класса, некоторые общедоступные методы в базовом классе могут больше не иметь значения, например. если Circle получен из Ellipse, а Ellipse имеет метод stretch(), который растягивает эллипс по одной оси, что вы делаете, когда метод вызывается на экземпляр Circle?
Единственная проблема возникает, если деструктор класса не определен как виртуальный. В этом случае это приведет к утечке памяти.
Отсутствует проблема синтаксиса, но вы теряете адрес экземпляра «базового класса», назначая новое значение переменной «bptr». Это приводит к утечке памяти, поскольку адрес первого инстанцированного класса теряется.
Если на вашем месте я бы вернуться и попросить вашего интервьюера пару вопросов:
И, пожалуйста, имея виртуальные деструкторы и т. Д., Выходим на место, только если у вас есть определения классов. Возможно, интервьюер тайно ищет ясновидящих типов.
Arpan
+1, Иногда вопросы также могут быть ответы .. :) – liaK
что здесь проблема?
Если ответ («утечка памяти») не будет принято, то проблема либо вопрос или интервьюер;)
я бы ответить на этот вопрос интервью как так:
Из ограниченного фрагмента кода при условии, что ясно, что утечка памяти будет возникать, когда мы назначаем указатель на экземпляр этого производного класса, поскольку у нас нет других указателей, обращающихся к базовому объекту. Однако невозможно сказать больше о фрагменте кода, не видя определения обоих классов и видя связь между двумя классами.
У вас есть это или декларация классов? – Nikko
Я собираюсь пойти с непоследовательной схемой именования. Если у вас 'baseclass' логически, у вас также будет' производный класс'. Кроме того, интервал всевозможных ошибок. * Все знают, что звездочка принадлежит типу, а не переменной. –
@Dennis Логически звездочка относится к типу, но синтаксически относится к переменной. Попробуйте это и скажите мне, является ли ptr2 указателем или нет: 'MyClass * ptr1, ptr2;'. –