zoukankan      html  css  js  c++  java
  • 模版调用析构函数的一个发现

    假如我这样写:
    int *a = new i;
    a->~int();
    肯定无法通过编译,因为基本类型是没有析构函数的。
    然而我在做内存池时遇到一个问题就是对像释放内存时,需要内存池自动析构该对像然后收回内存空间,但并不知道该对像是不是基本类型。
    于是我做了如下的实验:

    class A
    {
    public:
        A()
    {};
        
    ~A(){};
    }
    ;

    //相当于一个析构器
    template<typename T>
    void Deconstructor(T *&p)
    {
        p
    ->~T();
        free(p);
        p 
    = NULL;
    }


    int main()
    {
        
    int *= new int;
        Deconstructor(i);

        A 
    *= new A;
        Deconstructor(a);
    }


    结果发现编译、运行正常。输出汇编查找原因:
    找到“析构”整型的那段。


    16   :  p->~T();
    17   :  free(p);

     mov eax, DWORD PTR _p$[ebp]
     mov ecx, DWORD PTR [eax]
     push ecx
     call _free
     add esp, 
    4


    当T为int时编译器根本没有为~T()生成任何代码,这也是编译器的聪明之处吧。

  • 相关阅读:
    3秒后页面跳转代码
    数据库 ""和null的在java 持久化中的区别
    去掉标签元素
    hibernate 自动封装
    hql 多对多查询
    javascript 数组
    spring mvc+mybatis整合
    collection映射
    mybatis中one2many
    mybatis中many2one
  • 原文地址:https://www.cnblogs.com/Jonlee/p/565286.html
Copyright © 2011-2022 走看看