代码之家  ›  专栏  ›  技术社区  ›  jbcoe

为堆栈指定的对象调用析构函数的机制是什么?

  •  2
  • jbcoe  · 技术社区  · 15 年前

    class MyClass {
    public:
    
      ~MyClass()
      {
        std::cout<<"Destructor called."<<std::endl;
      }  
    
      MyClass()
      {
        std::cout<<"Constructor called."<<std::endl;
      }
    
    };
    
    ....................................................................
    
    //Limit scope for example
    {
      MyClass instance;
    }
    

    构造函数和析构函数都被调用。这是怎么回事?

    6 回复  |  直到 15 年前
        1
  •  7
  •   ur.    15 年前

    编译器在适当的位置插入对对象析构函数的调用。

        2
  •  4
  •   sbi    15 年前

    你不会奇怪为什么会这样

    {
      int i;
    }
    

    i 自动的,好吗?C++允许你创建类型,就像内置类型一样。就像内置类型一样,C++中(除了在,比如java或c++),这个

    {
      MyClass instance;
    }
    

    不只是定义可能绑定到的引用 null 或者一些真实的物体。信息技术 创造

    对象创建分两步进行:首先(在进入范围时)提供原始内存。然后(当遇到对象定义时)调用构造函数。对于内置类型,不调用构造函数。如果不初始化内置变量,则它有一个随机值。(实际上,这是步骤#1中提供的内存中的位模式。)对象删除也分两步进行:首先,调用析构函数(同样,不是针对内置函数),然后将内存返回到运行时系统。

        3
  •  3
  •   Managu    15 年前

        4
  •  3
  •   SadSido    15 年前

    是的,构造函数和析构函数都被调用。更重要的是:

    {
     MyClass instance;
     throw "exception";
    }
    

    在本例中,析构函数也被称为。这就是为什么我总是喜欢在堆栈上分配我的对象(或者至少用堆栈分配的守护者包装动态分配)。

        5
  •  1
  •   dicroce    15 年前

    调用构造函数是因为您正在创建对象。调用析构函数是因为您正在清理该对象。请记住,在C++中,在堆栈上声明的对象在包含的范围消失时自动清理。

        6
  •  0
  •   Jason Plank Steve Leung    13 年前

    它没有在构造函数之后调用析构函数。
    当它即将终止该计划时,它会调用它。

    int main() {
        MyClass obj;
        cout<<"testing....1"<<endl;
        cout<<"testing....2"<<endl;
        return 0;
    }
    

    Constructor called.
    testing....1
    testing....2
    Destructor called.