Предположим, что есть указатель базового класса, который указывает на объект базового класса:
baseclass *bptr;
bptr= new baseclass;
теперь, если я do
bptr= new derived;
в чем проблема?
Предположим, что есть указатель базового класса, который указывает на объект базового класса:
baseclass *bptr;
bptr= new baseclass;
теперь, если я do
bptr= new derived;
в чем проблема?
Очевидным ответом является то, что вы протекаете исходный объект базового класса.
Помимо очевидной утечки памяти, это зависит от определения baseclass
и derived
, некоторые из проблем могут быть:
derived
не публично выводится из baseclass
(если это ужасный вопрос, который нужно задать в интервью)baseclass
не имеет виртуального деструктора (в этом случае он небезопасен для delete bptr;
)Если бы я был вами, я бы повернул назад и задал вашему собеседнику пару вопросов:
И, при наличии виртуальных деструкторов и т.д., только если у вас есть определения классов. Возможно, интервьюер тайно ищет ясновидящих типов.
Арпан
в чем проблема?
Если ответ ( "утечка памяти" ) не принят, проблема заключается либо в вопросе, либо у интервьюера;)
В первой строке вы указали указатель. Во второй строке вы указываете ссылку в памяти. в строке 3 вы даете IT другую ссылку в памяти.
первая ссылка, которую вы указали на указатель, просочилась... вы никогда не сможете вернуть ее.
Он пытался добраться до проблемы Circle Ellipse? Если производная является специализацией базового класса, некоторые общедоступные методы в базовом классе могут больше не иметь значения, например. если Circle получен из Ellipse, а Ellipse имеет метод stretch(), который растягивает эллипс по одной оси, что вы делаете, когда метод вызывается на экземпляр Circle?
Вы переназначаете указатель, не освобождая память, выделенную для предыдущего объекта. Это может привести к утечке памяти, если ни один из объектов не сохранил значение bptr
перед тем, как переназначить его.
Имеет ли baseclass
виртуальный деструктор? Если нет, это может быть плохо (в дополнение к очевидной утечке).
Единственная проблема возникает, если деструктор класса не определен как виртуальный. В этом случае это приведет к утечке памяти
Существует проблема без синтаксиса, но вы теряете адрес экземпляра "базового класса", назначая новое значение переменной "bptr". Это приводит к утечке памяти, поскольку адрес первого инстанцированного класса теряется.
Я бы ответил на этот вопрос интервью так:
Из ограниченного фрагмента кода, при условии, что будет ясно, что утечка памяти произойдет, когда мы назначим указатель на экземпляр этого производного класса, поскольку у нас нет других указателей, обращающихся к базовому объекту. Однако невозможно сказать больше о фрагменте кода, не видя определения обоих классов, и видя связь между двумя классами.