Несколько новых и одно удаление - PullRequest
1 голос
/ 08 февраля 2012

Если DerivedClass1 и DerivedClass2 являются классами, производными от BaseClass, где BaseClass является полиморфным классом, какой из этих двух фрагментов кода является правильным?

BaseClass *ptr;

ptr = new DerivedClass1;
ptr->PrintName();

ptr = new DerivedClass2;
ptr->PrintName();

delete ptr;

или

BaseClass *ptr;

ptr = new DerivedClass1;
ptr->PrintName();

delete ptr;

ptr = new DerivedClass2;
ptr->PrintName();

delete ptr;

Многократное использование «new» перед использованием «delete» просто переопределяет значение ptr, или это вызывает какую-то утечку памяти? Извините, если это глупый вопрос, но я не могу найти ответ на него.

Ответы [ 4 ]

5 голосов
/ 08 февраля 2012

Ваш первый пример непременно просочится.Ваш второй пример может дать утечку, скажем, если PrintName() сгенерировал исключение.

Лучшей идеей является использование умного указателя, такого как std::unique_ptr:

std::unique_ptr<BaseClass> ptr;

ptr.reset(new DerivedClass1);
ptr->PrintName();

ptr.reset(new DerivedClass2);
ptr->PrintName();

Смотри, Ма,без удаления!

2 голосов
/ 08 февраля 2012

Второе правильно.Первая утечка экземпляра DerivedClass1.

1 голос
/ 08 февраля 2012

Конечно, второй правильный.Первое приводит к утечке памяти.

0 голосов
/ 08 февраля 2012

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

ptr = new Derived1;
delete ptr;
ptr = new Derived2;
delete ptr;
...