Код (краткое описание):
Есть примитивный класс tmp;
Создаю указатель obj на этот класс (без new).
Вывожу на экран отладочную информацию:
адрес_указателя, адрес_экземпляра, значение_члена_экземпляра.
Создаю экземпляр класса по этому указателю (new) - вызывается конструктор.
Вывожу на экран отладочную информацию.
Присваиваю члену экземпляра значение.
Вывожу на экран отладочную информацию.
Освобождаю память по указателю obj оператором delete - вызывается деструктор.
Вывожу на экран отладочную информацию.
Снова присваиваю члену экземпляра значение.
Вывожу на экран отладочную информацию.
Снова освобождаю память по указателю obj оператором delete - СНОВА вызывается деструктор.
Вывожу на экран отладочную информацию.
#include "iostream"
class tmp {
public:
int ii;
tmp() : ii(123) {std::cout << "__construct" << std::endl;}
~tmp() { std::cout << "__destruct" << std::endl; }
};
int main(int, char **)
{
tmp *obj;
std::cout <<&obj <<" " <<obj <<" " <<obj->ii <<std::endl <<std::endl;
obj = new tmp();
std::cout <<&obj <<" " <<obj <<" " <<obj->ii <<std::endl <<std::endl;
obj->ii = 4;
std::cout <<&obj <<" " <<obj <<" " <<obj->ii <<std::endl <<std::endl;
delete obj;
std::cout <<&obj <<" " <<obj <<" " <<obj->ii <<std::endl <<std::endl;
obj->ii = 5;
std::cout <<&obj <<" " <<obj <<" " <<obj->ii <<std::endl <<std::endl;
delete obj;
std::cout <<&obj <<" " <<obj <<" " <<obj->ii <<std::endl <<std::endl;
return 0;
}
Собираю под оффтопиком без оптимизации так: g++ test_delete.cpp -Wall -O0
Вывод:
a.exe
0x22fecc 0x22ffe0 -1
__construct
0x22fecc 0x3e25e8 123
0x22fecc 0x3e25e8 4
__destruct
0x22fecc 0x3e25e8 0
0x22fecc 0x3e25e8 5
__destruct
0x22fecc 0x3e25e8 4072936
Я считаю, что segfault должен был произойти еще на первой строчкепри попытке вывести адрес объекта - << obj
.
Ну, или по крайней мере тут: << obj->ii
.
Почему не падает?