Всякий раз, когда кто-то говорит int* nums = new int[3]
, система времени выполнения требуется для хранения количества объектов, 3
, в месте, которое может быть получено, зная только указатель, nums
. Компилятор может использовать любую технику, которую он хочет использовать, но есть два популярных.
Код, сгенерированный nums = new int[3]
может сохранить номер 3
в статическом ассоциативном массиве, в котором указатель nums
используются в качестве ключа поиска, и числа 3
является соответствующим значением. Код, созданный delete[] nums
, будет искать указатель в ассоциативном массиве, будет извлекать связанный size_t, а затем удалить запись из ассоциативного массива.
Код, сгенерированный nums = new int[3]
может выделить дополнительные SizeOf (size_t) байт памяти (возможно, плюс некоторое выравнивание байтов) и поставить значение 3
перед первым int
объекта. Тогда delete[] nums
найдет 3
, посмотрев фиксированное смещение перед первым int
объектом (то есть до *num
) и освободит память, начиная с начала выделения (то есть, блок памяти начнет фиксированное смещение до *nums
) ,
Ни одна техника не идеальна. Вот несколько компромиссов.
Метод ассоциативного массива медленнее, но безопаснее: если кто-то забывает []
при освобождении массива вещей, (а) запись в ассоциативном массиве будет утечкой и (b) только первый объект в массиве будет разрушено. Это может быть или не быть серьезной проблемой, но, по крайней мере, это может не привести к сбою приложения.
Техника overallocation быстрее, но более опасно: если кто-то говорит delete nums
, где они должны были сказать delete[] nums
, адрес, который передается оператору delete(void* nums)
не будет действительным кучного распределения, было бы по меньшей мере sizeof(size_t)
байтов после действительной распределение кучи. Это, вероятно, испортило бы кучу. - C++ Часто задаваемые вопросы
Вызов указателя на удаленный объект или массив - это UB. – strager
Для неопределенного поведения нет цели, ни рифмы, ни разума. –
@ Ханс: Мистер Роджерс не согласился: «Неопределенное поведение» рифмуется с «не будет ли вы моим соседом» ;-) –