Вероятно, это будет легче понять, если представить, что вы создаете несколько объектов MyClass внутри одного блока памяти.
В этом случае это будет выглядеть примерно так:
- Выделите гигантский блок памяти, используя новый символ [10 * sizeof (MyClass)] или malloc (10 * sizeof (MyClass))
- Используйте размещение new для создания десяти объектов MyClass вэта память.
- Сделайте что-нибудь.
- Вызовите деструктор каждого из ваших объектов
- Отмените выделение большого блока памяти, используя delete [] или free ().
Это то, что вы можете сделать, если вы пишете компилятор или ОС и т. Д.
В этом случае, я надеюсь, понятно, почемувам нужны отдельные шаги «деструктор» и «удаление», потому что нет причины, по которой вы будете вызывать удаление.Тем не менее, вы должны освободить память, как вы обычно это делаете (освобождаете, удаляете, ничего не делаете для гигантского статического массива, выходите нормально, если массив является частью другого объекта и т. Д., И т. Д.), И есливы не пропустите его.
Также обратите внимание, что, как сказал Грег, в этом случае вы не можете использовать delete, потому что вы наделили массив новым [], поэтому вам нужно будет использовать delete[].
Также обратите внимание, что вы должны предположить, что вы не переопределили удаление для MyClass, иначе оно сделает что-то совершенно другое, что почти наверняка несовместимо с «новым».
Так что ядумаю, вам не нравится называть «удалить», как вы описываете, но может ли это сработать?Я думаю, что это в основном тот же вопрос, что и «У меня есть два несвязанных типа, у которых нет деструкторов. Могу ли я создать указатель на один тип, а затем удалить эту память через указатель на другой тип?»Другими словами, «у моего компилятора есть один большой список всех выделенных вещей, или он может делать разные вещи для разных типов».
Боюсь, я не уверен.Читая спецификацию, он говорит:
5.3.5 ... Если статический тип операнда [оператора удаления] отличается от его динамического типа, статический тип должен быть базовым классомдинамический тип операнда и статический тип должны иметь виртуальный деструктор или поведение не определено.
Я думаю, это означает, что «если вы используете два несвязанных типа, это не работает (это нормально, чтобы удалитьобъект класса полиморфно через виртуальный деструктор). "
Так что нет, не делайте этого.Я подозреваю, что это может часто работать на практике, если компилятор смотрит только на адрес, а не на тип (и ни один из типов не является классом множественного наследования, который искажает адрес), но не пытайтесь это сделать.