Assign复制对象与对象复制到变量不同,Assign会复制对象的所有数据.
而一个对象复制给一个变量时,只是当前实例的指针指向另一个对象.
所以Assign复制后一个对象释放后,不会影响另一个.

解决方案 »

  1.   

    你似乎没弄明白我的意思耶。
    我说的是一个Windows对象,比如一个TCanvas对象Assign到另一个TCanvas对象,这时它们引用的应该是同一个DC句柄吧,那么其中一个TCanvas释放时,它引用的DC句柄是不是也释放了,如果是这样,那另一个TCanvas的Handle是不是引用就无效了?
      

  2.   

    yibin(张) 说的很明白
    变量复制是引用指针
    assign是内存复制 一个释放并不会影响另一个
      

  3.   

    //delphi 还有更强大的功能生存期自管理类型
    除了A n s i S t r i n g 以外,D e l p h i 还提供了其他几种生存期自管理类型,这些类型包括:
    Wi d e S t r i n g 、Va r i a n t 、O l e Va r i a n t 、i n t e r f a c e 、d i s p i n t e r f a c e 和动态数组,这些类型在本章稍后有
    介绍,现在,我们重点讨论究竟什么是生存期自管理,以及它们是如何工作的。
    生存期自管理类型,又被称为自动回收类型,是指那些在被使用时就占用一定的特殊资
    源,而在它离开作用域时自动释放资源的类型。当然不同的类型使用不同的资源,例如,
    A n s i S t r i n g 类型在被使用时就为字符串占用内存,当它超出作用域时就释放被字符串占用的内
    存。
    对于全局变量,这种情况是相当直观的:作为应用程序结束代码的一部分,编译器自动
    插入代码来清除每一个生存期自管理类型的全局变量。因为在应用程序在被装入时,全局变量
    都被初始化为0 ,每一个全局变量将用初始化时的0 、空或其他值来指示它还没有被使用,基于
    这种方法,终止代码只清除那些确实在应用程序中被使用的全局变量。
    对于局部变量来讲,这种情况稍微有的复杂:首先,在过程或函数开始运行时,编译器
    插入的代码保证初始化这些局部变量,接着,编译器产生一个t r y. . . f i n a l l y 的异常处理块,它包容整个函数体,最后,编译器在f i n a l l y 块插入代码来清除生存期自管理变量(异常处理块在2 . 1 9
    节“结构化异常处理”中介绍),为了能记住这些,请看下面的代码:
    procedure Foo;
    v a r
    S : s t r i n g ;
    b e g i n
    / /过程体
    / /在这里用S
    e n d ;
    虽然这个过程看起来简单,如果考虑进由编译器插入的代码,它看起来像下面的代码:
    procedure Foo;
    v a r
    S : s t r i n g ;
    b e g i n
    S:=' ';
    t r y
    / /过程体
    / /在这里用S
    f i n a l l y
    / /在这里清除S
    e n d ;
    e n d ;
      

  4.   

    赫赫,你Assign一个TCanvas看看??????会出现异常的。TCanvas是不能Assign的。
      

  5.   

    TCanvas是不能Assign ^_^
    不过TBitmap呢,它应该有引用一个HBitmap的Windows句柄吧,Assign另一个后,释放其中一个,它的HBitmap也就释放了吧,那剩下的那一个TBitmap的HBitmap不就引用无效了吗?