你的四个问题,可以归结为两个问题1.对象的拆构,
  一个对象要拆构,只在以下情况下发生:
  a.显式调用Destructor,或free或 destroy,
  b.程序结束,系统自动释放。
    对于一些创建时有宿主的对象,如Tform对象,并不需要显式的释放他,当它的宿主对
    象被释放时,他也会被释放,但也有例外,看下例:
    From1:=Tform.create(application);
       (程序结束,是自动释放);
    Form1:=Tform.create(nil);
       (需要手工释放);
    第一例form1的宿主是application,当程序结束时,application会调用它的destroy方法,每一个可以作为宿主对象的对象都有一个对象列表属性,它的destroy方法
 逐一调用它的对象列表中的对象的destroy方法,所以你的第四个问题中的 在拆构时调用iinherited很有必要的, 也是最安全的.忽略这些问题,会造成内存泄漏,使得程序每运行一次,系统资源减少一次,直到最后系统特别的慢,直到崩溃。
    第二例form1的宿主为nil,也就是没有宿主,这样就需要自己来解决释放问题。
     一般使用try finally end 结构。
2.对象的赋值与复制。
  对象是一个指针,但他和指针不同, 在你的问题1 中o2:=o1 实际上就是对象的复制,这也是对象和指针不同的地方,在使用过程中尽量要避免这种情况的发生,对象的复制
有时会占用很大的内存,消耗系统资源。一般的要进行对象的复制都是调用对象的assign()方法。你可以看一下assign方法实现的原码。
   看了以上的介绍,我向你应该自己能够对你的问题有个答案。如果还不明白,我可以下次在给你说明白点。