精华内容
下载资源
问答
  • 析构函数何时被调用析构函数在下边3种情况时被调用:对象生命周期结束,被销毁时;主动调用delete ;(推荐学习:PHP编程从入门到精通)对象i是对象o的成员,o的析构函数调用时,对象i的析构函数也被调用。PHP 5 ...

    c1390119a663db3b83157473b59b3334.png

    析构函数何时被调用

    析构函数在下边3种情况时被调用:

    对象生命周期结束,被销毁时;

    主动调用delete ;(推荐学习:PHP编程从入门到精通)

    对象i是对象o的成员,o的析构函数被调用时,对象i的析构函数也被调用。

    PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,如 C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。<?php

    class MyDestructableClass {

    function __construct() {

    print "In constructor\n";

    $this->name = "MyDestructableClass";

    }

    function __destruct() {

    print "Destroying " . $this->name . "\n";

    }

    }

    $obj = new MyDestructableClass();

    ?>

    和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用 parent::__destruct()。此外也和构造函数一样,子类如果自己没有定义析构函数则会继承父类的。

    析构函数即使在使用 exit() 终止脚本运行时也会被调用。在析构函数中调用 exit() 将会中止其余关闭操作的运行。

    Note:

    析构函数在脚本关闭时调用,此时所有的 HTTP 头信息已经发出。脚本关闭时的工作目录有可能和在 SAPI(如 apache)中时不同。

    Note:

    试图在析构函数(在脚本终止时被调用)中抛出一个异常会导致致命错误。

    展开全文
  • 析构函数什么时候调用

    千次阅读 2013-05-07 11:38:00
    何时调用析构函数:(以下摘自《C++ Prime》Page 412) 撤销类对象时会自动调用析构函数;变量在超出作用域时会自动撤销;动态分配的对象只有在指向该队向的指针被删除时才撤销;如果没有删除指向动态对象的指针,...

    构造函数的一个重要作用是为对象申请资源,相应地,析构函数要负责释放这些资源。下面理解一下析构函数:

    何时调用析构函数:(以下摘自《C++ Prime》Page 412)

    撤销类对象时会自动调用析构函数;变量在超出作用域时会自动撤销;动态分配的对象只有在指向该队向的指针被删除时才撤销;如果没有删除指向动态对象的指针,则不会运行该对象的析构函数,对象会一直存在,从而导致内存泄漏。PS:当对象的引用或者指针超出作用域时,不会运行析构函数。只有删除指向动态分配对象的指针或者实际对象(而不是对象的引用)超出作用域时,才会运行析构函数。

    下面对这条规律进行考察:

     #include <string.h>
    #include <vector>
    #include <iostream>
    
    using namespace std;
    
    int i=0;
    int j=0;
    
    class CDemo
    {
        public:
            CDemo():str(NULL){cout<<"constructor_"<<i++<<endl;};
            CDemo(const CDemo &cd){cout<<"constructor_"<<i++<<endl;this->str=new char[strlen(cd.str)+1];strcpy(str,cd.str);};
            ~CDemo(){cout<<"destrcutor_"<<j++<<endl;if(str) delete []str;};
            char *str;
    };
    
    int main()
    {
        CDemo *pDemo=new CDemo();
        cout<<"R1"<<endl;
        {
            CDemo d1;
    
            CDemo &d2=d1;
            d2.str=new char[32];
            strcpy(d2.str,"hello wordl");
        }
        cout<<"R2"<<endl;
        pDemo->str=new char[32];
        strcpy(pDemo->str,"this is pDemo2");
        delete pDemo;
    }
    
    程序输出结果
    constructor_0
    R1
    constructor_1
    destructor_0
    R2
    destructor_1
    符合上述规律。

    展开全文
  • 构造函数——————— __init__( self )析构函数——————— __del__( self )不像c++中那样构造函数和析构函数是类名字。并且在python中这构造函数和析构函数可以省略。先看简单的例子:class Simple:def __...

    python的构造和析构函数为固定的名字。

    构造函数———————   __init__( self )

    析构函数———————  __del__( self )

    不像c++中那样构造函数和析构函数是类名字。

    并且在python中这构造函数和析构函数可以省略。先看简单的例子:

    class Simple:

    def __init__( self ):

    pass

    def __del__( self ):

    pass

    def func( self ):

    pass

    上面定义了一个简单的类,一个构造函数,析构函数和普通的函数。

    如果觉得不需要构造函数和析构函数,那么这个类可以简化成

    class Simple:

    def func( self ):

    pass

    构造函数在类的构造的时候调用,但是不是一定会调用,这点我会在后面提到原因;析构函数被python的垃圾回收器销毁的时候调用。

    下面写的简单的类测试一下:

    类的定义:

    class Simple:

    def __init__( self ):

    print( "constructor called, id={0}".format( id( self )))

    def __del__( self ):

    print( "destructor called, id={0}".format( id( self )))

    def func( sef ):

    print( "Simple func" )

    使用类:

    a = Simple() #输出->constructor called, id = 3211123

    b = Simple() #输出->constructor called, id = 3211145

    a = Simple() #输出->constructor called, id = 32111225 #destructor called, id = 3211123

    上面构造2个对象a, b。 我们看到每一次构造一个对象,构造函数就会被调用一次。在构造函数中输出了被构造对象的id(id相当于c/c++对象的地址),是为了和后面的析构函数id比较。

    a的id为   3211123

    b的id为   3211145

    后面为什么又实例化 a呢,因为我们想要利用python的垃圾回收器自动回收我们的之前实例化的a对象,这样先会调用构造函数__init__来构造一个新的对象,这个新的对象的id为32111225,和我们之前a的id不一样。接下来垃圾回收器,发现已经没有变量来引用它了,因此就会调用a之前引用的对象id = 3211123的析构函数,然后从内存中彻底销毁它。

    注意是先构造新对象,然后才销毁旧对象。

    上面我们提到构造函数不是一定调用,那是什么情况下回出现这种情况呢? 如果类提供了__new__这个函数,并且没有返回实例,也就是没有返回解释器传给它的参数,那么构造函数__init__就不会被调用。

    关于__new__我们简单介绍一下

    它的引进是为了让程序员控制实例的创建过程,python的设计人员建议这个方法主要用在子类化稳定类型,如int, str。并且这个方法只有python新风格类(或者新类)才会被调用,新类是以object为基类的类。

    class Old:

    def __new__( self ):

    return self

    class New( object ):

    def __new__( self ):

    return super( New, self ).__new__( self )

    上面的New的就是一个新类,因为它继承自object,它的__new__会被调用,而Old类的__new__不会被调用。

    接下来我们做个测试来验证上面所说的。

    class Simple( object ):

    def __init__( self ):

    print( "constructor called, id={0}".format( id( self )))

    def __del__( self ):

    print( "destructor called, id={0}".format( id( self )))

    def __new__( self ):

    print( "new called, id={0}".format( id( self )))

    #return super( CA, self ).__new__( self )

    上面的__new__中我们屏蔽掉了返回实例的一行。然后我们实例化一个对象

    a = Simple()

    发现什么了,__init__没有被调用吧。

    上面对构造函数和析构函数做了测试,也知道它的作用和怎么用,下面对它们补充。

    构造函数 –   __init__

    如果基类和子类都有__init__,那么子类必须显式的调用的基类的__init__。

    析构函数   –   __del__

    如果基类和子类都有__del__,那么子类必须显式的调用的基类的__del__。

    如果你还想了解更多的关于构造函数和析构函数的内容,参考python官方的英文文档:

    完。

    版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.

    分享到:

    展开全文
  • 析构函数何时被调用 析构函数在下边3种情况时被调用: 对象生命周期结束,被销毁时; 主动调用delete ;(推荐学习:PHP编程从入门到精通) 对象i是对象o的成员,o的析构函数调用时,对象i的析构函数也被调用...

    析构函数何时被调用

    析构函数在下边3种情况时被调用:

    对象生命周期结束,被销毁时;

    主动调用delete ;(推荐学习:PHP编程从入门到精通)

    对象i是对象o的成员,o的析构函数被调用时,对象i的析构函数也被调用。

    PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,如 C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。

    <?phpclass MyDestructableClass {   function __construct() {       print "In constructor\n";       $this->name = "MyDestructableClass";   }   function __destruct() {       print "Destroying " . $this->name . "\n";   }}$obj = new MyDestructableClass();?>

    和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用 parent::__destruct()。此外也和构造函数一样,子类如果自己没有定义析构函数则会继承父类的。

    析构函数即使在使用 exit() 终止脚本运行时也会被调用。在析构函数中调用 exit() 将会中止其余关闭操作的运行。

    Note:

    析构函数在脚本关闭时调用,此时所有的 HTTP 头信息已经发出。脚本关闭时的工作目录有可能和在 SAPI(如 apache)中时不同。

    Note:

    试图在析构函数(在脚本终止时被调用)中抛出一个异常会导致致命错误。

    转载于:https://www.cnblogs.com/68xi/p/11528033.html

    展开全文
  • 如题,当一个类为基类的时候,通常其析构函数被声明为虚函数,这是为啥?class BaseCls{public: BaseCls() { printf("BaseCls()n"); } ~BaseCls() { printf("~BaseCls()n"); } void test_func() { printf("Base::...
  • 在阅读C++项目(caffe)源码时,发现不少基类不仅把常规的成员...为什么要把析构函数定义为虚函数?常规随便写一段C++代码作为实例,在这个例子中,我们先不把析构函数定义为虚函数:class Base {public: Base () { ...
  • 构造函数——————— __init__( self )析构函数——————— __del__( self )不像c++中那样构造函数和析构函数是类名字。并且在python中这构造函数和析构函数可以省略。先看简单的例子:class Simple:def __...
  • C++——析构函数什么时候调用

    千次阅读 2020-09-07 10:25:29
    3.对象A是对象B的成员,B的析构函数调用时,对象A的析构函数也被调用。 举例来说: class A { public: A() {ma = new int(1000);} A(size sz) {ma = new int(sz);} virtual ~A() { delete ma;} in...
  • 析构函数什么时候调用

    千次阅读 2014-06-18 15:49:22
    我希望c#程序在退出后自动向...然后在CLI程序一运行的时候就new A了 但是我发现程序的窗口关闭后并没有调用析构 是我用错了?还是有其他方法控制程序退出时的调用?谢谢 2012年11月22日 3:34 回复 | 引用
  • 析构函数不被调用

    千次阅读 2018-08-18 11:50:05
    写了一个测试,验证什么时候析构函数不被调用 Mycode.cpp里 #include "stdafx.h" #include "Mycode.h" Mycode::Mycode() {  ::MessageBoxW(NULL,_T("构造函数"),0,IDOK); }; My...
  • 在主函数中定义的对象会在主函数完全结束后进行析构,而如果你在主函数中调用的函数里面定义的对象则会在这个函数调用结束之后析构掉,就是说析构函数都是在每个函数运行完后自动调用,注意这个函数不光指主函数,也...
  • #include <iostream> using namespace std; class Student{ public: ... Student(){num = 0;... void Setstudent(int n, char na[10], char s[3], int a, double sc1, ...为什么最后调用析构函数时候无限调用
  • c++中析构函数会被调用几次,什么时候调用,调用次数和什么有关
  • 1.创建一个名为stock1的Stock对象,并将其数据成员初始化为指定的值: Stock stock("NanoSmart", 12, 20.0);...2.允许调用析构函数来创建一个临时变量,然后将该临时变量复制到stock2中,并丢弃它,如果...
  • 什么时候系统会自动调用析构函数呢? 答案是定义的对象位于栈区 这个时候,我们不需要什么操作,析构函数会自动调用 而当对象位于堆区 例如new出来的对象,调用析构函数是在我们delete它的时候被调用的 class A { ...
  • 什么时候必须显式调用析构函数

    千次阅读 2012-02-10 16:03:27
    析构函数可以自己调用 msdn says: Calling a destructor explicitly is seldom necessary. However, it can be useful to perform cleanup of objects placed at absolute addresses. These objects are ...
  • 构造函数,析构函数调用虚函数的理解:首先虚函数是依赖于指针起作用的,所以再构造的时候我们根本没有通过一个基类的指针来做什么操作,所以这种想法是没有意义的,何况这个虚函数表这个时候还没创建好。至于析构...
  • 基础知识: C++中,一个类在建成时,需要有构造函数初始化。即当一个类的对象在生成...那么,当一个派生类继承了一个基类,这时候调用析构函数,会发生什么呢? #include <iostream> using namespace std;...
  • 什么时候调用析构函数? 当对象超出范围时,将自动调用析构函数: 函数结束 程序结束 包含局部变量的块结束 调用delete运算符 析构函数与常规成员函数的区别? 析构函数以波浪号(~)开头,与类名相同。析构函数不...
  • 目录 0. 整体概述为什么要引入构造函数 1. 声明和定义构造函数 程序声明对象时,将自动调用构造函数 1.1 成员名和参数名 ...什么时候调用析构函数呢? 5 改进Stock类 stock10.h Stock10.cpp ...
  • 析构函数

    2019-10-02 11:26:22
    什么是析构函数 创建对对象时,系统会自动调用构造函数为我们进行初始化,同样,在销毁对象时也会自动调用一个函数为我们收尾,如释放内存等,这个函数是析构函数。...什么时候调用析构函数 对象生命周...
  • php构造函数是对象创建完成后,第一个自动调用的方法,析构函数是当对象被释放之前最后一个自动调用的方法。本文章向大家介绍php构造函数与析构函数。php构造函数1.是对象创建完成后,“第一个”“自动调用”的方法2....
  • 析构函数调用

    2015-03-12 11:18:00
    很简单但是经常会疑惑或者犯错误,不知道析构函数什么时候调用。 而且如果class a中含有指针,然后给class b赋值后,经常会犯一个知名的错误。 class a{ int i; int * pointer; ... } class b{ int i; ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 564
精华内容 225
关键字:

析构函数什么时候调用