Я думаю, вы могли бы воспользоваться очень простым примером:
int main(int argc, char* argv[])
{
N* n = new N();
} // n is destructed here
Это тоже ничего не печатает.
Почему? Поскольку pointer
(n
) разрушен, а не объект, указанный на *n
.
Конечно, вы не захотите, чтобы он уничтожил объект, на который указывает:
int main(int argc, char* argv[])
{
N myObject;
{
N* n = &myObject;
} // n is destructed here, myObject is not
myObject.foo();
} // myObject is destructed here
Вы должны помнить, что в отличие от языков, таких как C#
или Java
, существует два способа создания объектов в C ++: непосредственно N myObject
(в стеке) или через new
, как в new N()
, в этом случае объект помещается в кучу, и вы несете ответственность за его освобождение в более позднее время.
Итак, ваш деструктор уничтожает указатель, но не объект, на который указывает. Выделите объект без нового (и без использования указателя) или используйте Smart Pointer
, если вы хотите, чтобы он был автоматическим.