Разве `delete []` не является аналогом `new []`? - PullRequest
0 голосов
/ 06 апреля 2020

Я читаю bru sh на знаниях C ++, которым почти два десятилетия, чтобы понять онлайн информацию о фабричном шаблоне. Конечный контекст использования, вероятно, будет на другом языке третьего поколения (3GL), но из-за моего прошлого опыта я думаю, что легче следовать C ++, чем (скажем) Java, хотя последний может быть менее сложным в синтаксисе. Однако более серьезная причина заключается в том, что единственный пример кода, который я могу найти для рассматриваемой проблемы, т. Е. В отсутствие шаблона фабрики, находится на C ++. В большинстве постов рассказывается о причинах использования шаблона в высокоуровневом повествовании, а затем предоставляется код, показывающий механику шаблона вместо проблемы при отсутствии шаблона.

Код, который я изучаю находится здесь . Мне трудно понять, что delete[] используется для уничтожения объектов, созданных с использованием new. Согласно различным показаниям, delete используется с new, а delete[] используется с new[]. Однако после столь длительного ухода от C ++ я вполне мог упустить из виду нечто очевидное. Приведенный код в порядке, или я прав?

Мои показания по new и delete:

1 Ответ

1 голос
/ 06 апреля 2020

Не является ли delete[] аналогом new[]?

Да.

delete используется с новым, а delete [] является используется с новым []

Правильно.

Хотя и должно быть pedanti c, delete[] предназначено для удаления массивов. new T[] всегда выделяет массив, но new T также может выделять массив, если T является типом массива. Но этот угловой случай не относится к связанной статье. Поведение статьи не определено.


Дело даже не в том, что ошибки в статье заканчиваются. Есть больше. Например, поведение удаления с помощью указателя на Vehicle, который указывает на базовый подобъект производного объекта, не определен, поскольку деструктор Vehicle не является виртуальным.

Кроме того, Client является копируемый, но его конструктор копирования и оператор присваивания нарушают инвариант класса уникальности, который необходим для правильности деструктора.

...