Как действительно удаляет [], “знают” размер массива операнда?

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
235
задан BartoszKP 10 September 2015 в 07:02
поделиться

7 ответов

При выделении памяти на "куче" средство выделения будет отслеживать то, сколько памяти Вы выделили. Это обычно хранится в "главном" сегменте непосредственно перед памятью, что Вы выделяетесь. Тот путь, когда пора освободить память, de-средство-выделения, знает точно сколько памяти к свободному.

168
ответ дан Lightness Races with Monica 23 November 2019 в 03:28
поделиться

Информация не стандартизирована. Однако в платформах, что я работал над этой информацией, хранится в памяти незадолго до первого элемента. Поэтому Вы могли теоретически получить доступ к нему и осмотреть его, однако это не стоит того.

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

9
ответ дан Daemin 23 November 2019 в 03:28
поделиться

Это не что-то, что это находится в спецификации - это является зависящим от реализации.

3
ответ дан jeffm 23 November 2019 в 03:28
поделиться

В основном ее расположенный в памяти как:

[информация] [мадам Вы попросили...]

, Где информация является структурой, используемой Вашим компилятором для хранения объема памяти, выделенного, и что нет.

Это является зависящим от реализации все же.

5
ответ дан Francisco Soto 23 November 2019 в 03:28
поделиться

Это определяется в стандарте C++, чтобы быть конкретным компилятором. Что означает волшебство компилятора. Это может порвать с нетривиальными ограничениями выравнивания по крайней мере на одну основную платформу.

можно думать о возможных реализациях путем понимания, что delete[] только определяется для указателей, возвращенных new[], который не может быть тем же указателем, как возвращено operator new[]. Одна реализация в дикой природе должна сохранить количество массива в первом интервале, возвращенном operator new[], и иметь new[], возвращают смещение указателя мимо этого. (Поэтому нетривиальное выравнивание может повредиться new[].)

Имеют в виду это operator new[]/operator delete[]! = new[]/delete[].

Плюс, это ортогонально к тому, как C знает размер памяти, выделенной malloc.

3
ответ дан Tim Cooper 23 November 2019 в 03:28
поделиться

Поскольку массив, который будет 'удален', должен был быть создан с единственным использованием 'нового' оператора. 'Новая' операция должна была поместить ту информацию о "куче". Иначе, как был бы дополнительное использование новых знать, где "куча" заканчивается?

2
ответ дан Joel Coehoorn 23 November 2019 в 03:28
поделиться

Это не стандартизировано. Во времени выполнения Microsoft новый оператор использует malloc (), и оператор delete использует свободный (). Так, в этой установке Вашего вопроса эквивалентно следующему: Как действительно освобождает (), знают размер блока?

существует некоторое бухгалтерское продолжение негласно, т.е. во времени выполнения C.

0
ответ дан Andre 23 November 2019 в 03:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: