Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
При выделении памяти на "куче" средство выделения будет отслеживать то, сколько памяти Вы выделили. Это обычно хранится в "главном" сегменте непосредственно перед памятью, что Вы выделяетесь. Тот путь, когда пора освободить память, de-средство-выделения, знает точно сколько памяти к свободному.
Информация не стандартизирована. Однако в платформах, что я работал над этой информацией, хранится в памяти незадолго до первого элемента. Поэтому Вы могли теоретически получить доступ к нему и осмотреть его, однако это не стоит того.
Также это - то, почему необходимо использовать, удаляют [], когда Вы выделили память с новым [], поскольку версия массива удаляет, знает, что (и где) это должно надеяться освобождать правильный объем памяти - и называть соответствующее количество деструкторов для объектов.
Это не что-то, что это находится в спецификации - это является зависящим от реализации.
В основном ее расположенный в памяти как:
[информация] [мадам Вы попросили...]
, Где информация является структурой, используемой Вашим компилятором для хранения объема памяти, выделенного, и что нет.
Это является зависящим от реализации все же.
Это определяется в стандарте C++, чтобы быть конкретным компилятором. Что означает волшебство компилятора. Это может порвать с нетривиальными ограничениями выравнивания по крайней мере на одну основную платформу.
можно думать о возможных реализациях путем понимания, что delete[]
только определяется для указателей, возвращенных new[]
, который не может быть тем же указателем, как возвращено operator new[]
. Одна реализация в дикой природе должна сохранить количество массива в первом интервале, возвращенном operator new[]
, и иметь new[]
, возвращают смещение указателя мимо этого. (Поэтому нетривиальное выравнивание может повредиться new[]
.)
Имеют в виду это operator new[]/operator delete[]
! = new[]/delete[]
.
Плюс, это ортогонально к тому, как C знает размер памяти, выделенной malloc
.
Поскольку массив, который будет 'удален', должен был быть создан с единственным использованием 'нового' оператора. 'Новая' операция должна была поместить ту информацию о "куче". Иначе, как был бы дополнительное использование новых знать, где "куча" заканчивается?
Это не стандартизировано. Во времени выполнения Microsoft новый оператор использует malloc (), и оператор delete использует свободный (). Так, в этой установке Вашего вопроса эквивалентно следующему: Как действительно освобождает (), знают размер блока?
существует некоторое бухгалтерское продолжение негласно, т.е. во времени выполнения C.