Пришло время узнать, что такое неопределенное поведение.:)
В C ++, когда вы делаете что-то нелегальное / бессмысленное / плохое / и т.д.стандарт часто говорит, что «это ведет к неопределенному поведению».Это означает, что с этого момента состояние вашей программы полностью не гарантировано, и может произойти все, что угодно.
В момент, когда вы делаете свой последний *(pTest)
, вы получаете неопределенное поведение.Это связано с тем, что pTest
не указывает на действительный объект и разыменование такого указателя не определено.То, что вы видите, полностью разрешено: неопределенный вывод.
Все, что вы сделали, это сказали: «Я закончил с этим распределением».Как только вы сказали это, вы больше не должны (и, действительно, не можете) проверять или заботиться об этой памяти.Это даже не имеет концептуального смысла освобождать что-то и пытаться использовать это;Вы сказали, что сделали!
Ваш вывод несколько предсказуем, хотя: скорее всего, ваша ОС просто говорит: «Хорошо, спасибо за память» и все.У него нет никаких причин «сбрасывать» память или делать что-то особенное.Это действительно было бы пустой тратой времени, когда никто (включая вашу собственную программу) не использует ее.
Но помните, этот вывод совершенно не определен.Не пытайтесь использовать объекты, которые не существуют.Возможно, лучшим тестом было бы:
#include <iostream>
struct foo
{
~foo()
{
std::cout << "foo is gone :(" << std::endl;
}
};
int main(void)
{
foo* f = new foo();
delete f; // you'll see that the object is destroyed.
}
Хотя, кажется, вы искали, что происходит с самой памятью.Просто помните, что нет смысла избавляться от памяти, а затем попытайтесь ее использовать, поэтому ответ таков: кто знает.Это зависит от вашей конкретной платформы, которая не волнует C ++.