构建了两个对象却被析构了四次,求解释··

构建了两个对象却被析构了4次,求解释··
#include<iostream>
using namespace std;
class A
{
public:
int a;
A(int a=0):a(a){
}
~A(){
cout<<"被析构"<<endl;
}
};
int main(int argc,char *argv[]){
A a;
cout<<a.a<<endl;
a.~A();
cout<<a.a<<endl;
A b;
b.~A();
cout<<b.a<<endl;
}
为什么创建的对象析构了之后还能再用,而且里面的值也没有改变,更奇怪的是明明创建了两个对象,为什么会析构4次,不理解,求解释····

------解决方案--------------------
析构函数一般不主动调用吧?

不然搞析构函数干嘛?
------解决方案--------------------
因为你显示地调用了析构,你这样调用的话,会导致后面对对象操作会失败,像这样显示地调用一般都是在new的时候才会这样做的。而没有new,你进行的显示调用析构,这只是作为他的"普通"一个方法,在你的程序结束时,系统会自动给你调用析构的。
------解决方案--------------------
编译器会把 析构函数 函数插到适合的地方被调用的,像这个程序,编译的时候,编译器会把a,b的析构函数插到}之前。而楼主自己又主动调用析构函数,这样加起来就会被调用四个


之所以存在析构函数,大概是因为怕忘记把申请的资源释放掉,把释放资源的代码放到析构函数中,可以保证能够被释放,而不用显示的在一些地方调用释放
------解决方案--------------------
你的构造函数是值传递,构造的是一个副本,第一次调用析构的也是这个副本。
析构构调用四次,其中两次是你调用析构副本的,另外两个是系统调用析构对象本身的。
------解决方案--------------------
析构函数几乎不显示调用,它会在类的对象被释放的时候自动调用。。你调用两次, 程序结束再调用两次。所以会出现调用4次的情况。。。