zoukankan      html  css  js  c++  java
  • Delphi高手突破第二章(1),堆与栈,构造与析构函数

    Delphi里定义一个类:
    type
    TMyClass = class
    end;

    使用方法:
    var
    MyObj: TMyClass;
    begin
    MyObj:=TMyClass.Create(); // 构造函数
    MyObj.Free(); // 调用析构函数
    end;


    Delphi的简单类型,如Integer, char, record等,按值传递或使用,其内存空间从栈中分配。
    Delphi的复杂类型(class),则按引用传递或使用,其内存空间从堆中分配。

    在创建对象时,其构造函数不会被编译器自动调用,没有C++所谓的“默认构造函数”。
    调用构造函数来创建对象以及析构函数消灭对象,都是程序员自己的职责。

    构造一个对象分为两步:
    1. 分配对象本身所占用的内存空间
    2. 执行类的构造函数,初始化各数据成员、申请对象需要的其它资源

    注意:如果没有为自己的类提供构造函数,它的对象也能建立。原因是编译器自动调用了system.pas的_ClassCreate函数,它为每个对象分配合适的内存。这个动作称为“编译器魔法”(Compiler Magic)。

    总结:
    1. 对象本身占内存的分配是由编译器完成的,因此即使没有构造函数,对象也一样可以被构造。
    2. 构造函数Create的职责只是初始化对象的数据成员。没有构造函数的话,编译器会对所有数据进行清零初始化。
    3. 由于Object Pascal中所有类都是从TObject类派生,因此编译器会调用TObject.Create()构造函数。只不过这是一个空函数。


    析构函数是Destroy
    比如:
    type
    TMyClass = class
    public
    Destructor Destroy(); override;
    end;
    注意:
    1. 加上override声明,是为了保证在多态情况下对象能够正确被析构。否则编译器会给出警告。
    2. 析构对象的时候,应该调用对象的Free()方法,而不是Destroy()方法。原因是它会自动判断对象本身是否nil,然后再调用Destroy()
    3. 同样的,在编译器执行完Free()方法后,会自动插入汇编代码调用_ClassDestory函数,收回对象本身所占的内存空间。

  • 相关阅读:
    CesiumLab V1.1 新功能 (免费Cesium处理工具集)
    cesium 加载shp格式的白模建筑
    Cesium项目实战(3)-城市建筑三维白膜数据的制作与效果展示
    Tomcat内存优化
    ActiveMQ笔记(5):JMX监控
    mac机上搭建php56/nginx 1.8.x/thinkphp 3.2.x/gearman扩展/seaslog扩展/redis扩展环境
    大众点评cat系统的搭建笔记
    ActiveMQ笔记(4):搭建Broker集群(cluster)
    ActiveMQ笔记(3):基于Networks of Brokers的HA方案
    ActiveMQ笔记(2):基于ZooKeeper的HA方案
  • 原文地址:https://www.cnblogs.com/findumars/p/2628951.html
Copyright © 2011-2022 走看看