C++里面 代码 mystack[top--].~T();

mystack是指针 T是模板参数 这是什么用法? 不像析构函数啊

第1个回答  2017-10-27
class aaa
{
public:
    aaa(){}
    ~aaa(){cout<<"deconstructor"<<endl; }
    void disp(){cout<<"disp"<<endl;}
private:
    char *p;
};
void main()
{
aaa a;
a.~aaa();
a.disp();
}
这样的话,显式两次destructor,第一次析构相当于调用一个普通的成员函数,执行函数内语句,显示
第二次析构是编译器隐式的调用,增加了释放栈内存的动作,这个类未申请堆内存,所以对象干净地摧毁了,
显式+对象摧毁;
#include <iostream>

using namespace std;
class aaa
{
public:
    aaa(){p = new int(3);}
    ~aaa()
    {
        cout<<"deconstructor"<<endl;
        delete p;//手工释放堆内存
    }
    void disp(){cout<<"disp"<<endl;}
private:
    int *p;
};
void main()
{
    aaa a;
    a.~aaa();//显示调用析构函数
    a.disp();





这样的话,第一次显式调用析构函数,相当于调用一个普通成员函数,执行函数语句,释放了堆内存,但是并未释放栈内存,对象还存在(但已残缺,存在不安全因素);
第二次调用析构函数,再次释放堆内存(此时报异常),然后释放栈内存,对象销毁

本回答被提问者和网友采纳
第2个回答  2019-10-08
我用的mingGW 32bit的编译器,遇到了和你一样的问题,在数组上去调用一个Template模板的析构函数。 结果是无效,数组内的元素没有被删除成功,但是编译器也没有报错。
找到原因了。你的stack[top--].~T()在语义上是要销毁栈顶实体的,如果这个元素实体是内置类型如:int,double,内置指针类型等是无法销毁的,但是如果模板实参类型持有需要管理生命周期的资源呢?比如数组元素是一个自己定义的类类型而且这个类有它自己的析构函数,那么当我们stack[top--].~T()这样调用的时候实际上是显式调用栈顶类类型元素实体自己的析构函数。
这样数组里面的一个类类型元素实体就自己销毁了。
第3个回答  2019-09-16
首先调用析构函数~T()释放top的内存,然后top--将top向下平移一个。代码主要用于栈的删除操作。
第4个回答  2017-10-27
显式调用析构函数吧
相似回答