destructor کلاس هم مثل بقیه توابع هستش با این تفاوت که زمان پاک شدن شی کلاس صدا زده میشه
این اتفاق هم وقتایی میفته که کلاس delete بشه یا از scope خارج بشین مثلا
#include <iostream>
using namespace std;
class A
{
public:
~A(){cout<<"in destructor\n";}
void foo(){cout<<1;}
};
void f()
{
A a;
A *b=new A;
delete b;//call b destructor
}// out of a scope call a destructor
int main()
{
f();
A a;
a.~A();//call destructor
a.foo();//oops undefined behavior
}//call a destructor
از اون جایی که مخرب کلاس خودش یک تابع هستش صدا زدنش مشکلی نداره ولی باعث نمیشه حافظه گرفته شده بوسیله کلاس پاک بشه فقط کاری که می کنه اینه که به برنامه می گه اون مقدار رمی که اشغال شده مربوط به کلاس نیست !
و این که صدا زدن توابع کلاس بعد از صدا زدن سازنده میشکل داره یعتی مثلا توی کد بالا استفاده از a.foo باعث میشه برنامه درست کار نکنه و undefined behavior هستش .
ضمنا صدا زدن destructor کلاس کاربرد زیادی نداره بهتره این کارو نکنین !