zoukankan      html  css  js  c++  java
  • Delphi初始化和析构 initialization和finalization

    原文转载于:http://shao198888.blog.163.com/blog/static/238380067201502010141545

    1 initialization和finalization

      测试办法:启动一个控制台程序,因为一般的application有太多的单元引用,可能会造成一些调试上的麻烦

      经过测试,大致结果可能是这样的

      加载顺序与project及各单元的引用顺序有关

      首先从project文件中加载第一个单元如A,在试图加载A的Initialization时,先查看A的uses部分,这里的uses不分Interface部分还是implementation部分,只分先后顺序,当发现A有Uses单元时,比如依次引用了单元B和C,则在加载A的Initialization前,先加载B(这里可以理解为将A压入堆栈,专门处理B),依次递归,假如在对B单元进行处理时,发现B引用了A,根据测试结果,猜测是先到“堆栈”里看有没有A单元,如果有,就跳过A的这部分处理,如果没有,就把B压入堆栈,处理新的引用单元

    或者说在初始化时,有一个假想的队列,开始是空的,项目加载时,把第一个单元放在队列头上,然后,将第一个单元打开,依次取uses的单元,如果队列中没有这个单元名,就追加到队列尾部,如果队列中已经有了,就跳过这个单元,依次递归,最后,把项目所有uses到的单元放到一个队列中,然后,

    Initialization的顺序是:从队列尾部倒推,依次执行各单元的initialization,

    而finalization的顺序正好相反,从队列头部向后执行

    上边的是有可能是错误的,简单来说,就是一个递归,碰到uses就找源码,递归到源码的uses,如果一个单元没有uses,则执行这个单元的Initialization

    关于队列的说法太武断了,应当就是一个简单的递归,我的算法不好,不知道如何描述。。

  • 相关阅读:
    【转】Linux逻辑卷管理
    oracle range分区表已经有了MAXVALUE 分区,如何添加分区?要不能删除MAXVALUE分区里的数据,不影响在线应用。
    切换用户后whoami打印用户的问题
    tomcat版本号修改已dwr配置错误安全漏洞整改
    [LeetCode]: 64: Minimum Path Sum
    [LeetCode]: 292: Nim Game
    [LeetCode]: 22 : Generate Parentheses
    [LeetCode]: 121: Best Time to Buy and Sell Stock
    [LeetCode]: 62: Unique Paths
    [LeetCode]: 145: Binary Tree Postorder Traversal
  • 原文地址:https://www.cnblogs.com/python001/p/4237668.html
Copyright © 2011-2022 走看看