Обмен технологиями

Объяснение неопределенной проблемы смешивания delete и delete[]

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Мы знаем, что delete используется для освобождения динамического пространства, а delete[] — для освобождения нескольких динамических пространств, но какие проблемы возникнут, если мы их смешаем? Я прочитал много статей в блоге, но они неудовлетворительные, поэтому я написал эту статью, чтобы вы знали, что это такое и почему (Поверхностное объяснение, поправьте меня.)。

---------------------------------------------------------------------------------------------------------------------------------

Сначала мы можем рассмотреть пример:

Результат работы:

Но если мы не напишем деструктор явно:

Результат - нормальная работа:

---------------------------------------------------------------------------------------------------------------------------------

почему?

Если я вас спрошу, сколько места система выделяет под эти 10 объектов класса А, то вы, скорее всего, ответите 40 байт.Это легко понять. Один А — это 4 байта, а 10 — это 40 байт. .Но на самом деле, если вы напишете деструктор самостоятельно, всего будет выделено 44 байта. Если вы не напишете деструктор, всего будет выделено 40 байт.

Почему после записи деструктора остается еще 4 байта? Мы знаем, что после использования delete для освобождения этого места будет автоматически вызван деструктор (http://t.csdnimg.cn/f2FOj), (1) Если мы пишем деструктор самостоятельно, то delete необходимо его вызвать (Фактически, удаление — это тоже функция, что эквивалентно вложенному вызову функции.), то сколько раз оно вызывается — вопрос. Эти четыре байта имеют размер целого числа. Это целое число используется для записи количества объектов в этом пространстве, тем самым определяя, сколько раз нужно вызвать конструктор и деструктор. называется.Однако вы должны знать, что указатель p по-прежнему указывает на первый объект, но он будет двигаться вперед, чтобы получить количество объектов во время создания и разрушения., конкретное соотношение таково:

(2) Если мы не напишем деструктор в данный момент, он вызовет деструктор, сгенерированный компилятором, без записи количества раз (это может включать более низкий уровень, я не уверен в этом, пожалуйста, поправьте меня), и нет необходимости открывать дополнительную пластическую хирургию.

Хорошо, теперь мы можем объяснить приведенный выше пример.

Удаление по умолчанию освобождает место из позиции, на которую указывает указатель; delete[] сначала проверяет, открыто ли больше места по умолчанию, и если да, перемещает указатель на одну позицию вперед, прежде чем освободить его. Если вы открываете дополнительное пространство или используете удаление для освобождения пространства, открытое пространство не может быть освобождено, что приводит к утечке памяти, поэтому сообщается об ошибке.

Получу ли я ошибку, если буду практиковать это? :

Нет необходимости вызывать деструктор, нет необходимости подсчитывать количество объектов и нет необходимости открывать больше места. Следовательно, пространство можно освободить из позиции, указанной указателем, поэтому ошибки не будет. сообщил.

Ситуаций много, можно спуститься и попробовать самому.

Мне не хватает умения выражать свои мысли. Пожалуйста, прочитайте это несколько раз, и вы обязательно что-то получите.