delphi中所有的对象只能构造在堆中,和C++不一样,C++是可以在堆,堆栈,数据段中建立对象的.
请问delphi这样做有什么好处,而C++这样做复杂在那里,请教各位.

解决方案 »

  1.   

    >>C++是可以在堆,堆栈,数据段中建立对象的...
    你说的“对象”是什么?类的实例?
    “建立”对象是什么意思?是实例化一个类?实例化一个类必然要new,而new必然在堆上分配内存,怎么能在堆栈上?
    还请高手指教。
      

  2.   

    主要是语法不同的关系,实现上没有什么不能的,也就是如果Delphi开发组愿意提供这样的语法,也可以让Delphi具有在堆上创建对象,甚至形式上要比C++丰富,因为Delphi的RTTI比C++的RTTI要丰富。不过这里没有什么简化对象传递的问题,看需要而定,如果对象的生命期只限于声明对象的函数或过程,在堆上创建对象相对要快一点,但是函数退出对象也就释放,如果要将对象传递到函数生命期以外,那么对象必须在堆分配,而不能在堆中分配,因为一旦函数退出,栈必须恢复到调用者的环境,那么未释放的对象所处于的栈的空间的内容将被无意中破坏其实是Delphi不具有这些优秀语言特性,或者说语言的设计人和实现者所侧重的东西不同
      

  3.   

    我觉得只在堆中分配空间便于系统管理,像C#,java,也都是在堆中分配空间的,而且都提供了垃圾回收机制,这点在C++上就做不到,因为他的对象空间比较复杂,所以他必须要程序员来管理.
    想到这个问题,只是觉得每次退出函数的时候都要调用free来 destroy 对象有点不习惯而已,我想delphi迟早也会提供垃圾回收机制的.
      

  4.   

    >>实例化一个类必然要new,而new必然在堆上分配内存,怎么能在堆栈上?
    还请高手指教。procedure func;
    var
       obj: someObj;//其实好似引用
    begin
      obj := SomeObj.Create;//在堆栈中建立obj对象.
      //离开的时候必须
      obj.free;
    end;
      

  5.   

    >>obj := SomeObj.Create;//在堆栈中建立obj对象.---???在堆上吧
    楼主不是也说“delphi中所有的对象只能构造在堆中”吗?
    。。还是用英文吧,免得打字出错。。c++中,无论malloc还是new都是在heap上分配内存,不是在stack上啊obj: someObj;//其实好似引用???这句话什么意思,解释一下啦
      

  6.   

    这个问题2年前我们在BCB里面就讨论过。
    李维的VCL inside里面好像也提到了。其实是Delphi不具有这些优秀语言特性,或者说语言的设计人和实现者所侧重的东西不同
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    这个观点不敢苟同。
      

  7.   

    先更正一下打错字的地方:>也可以让Delphi具有在堆上创建对象,
    应为:也可以让Delphi具有在栈上创建对象,>在堆上创建对象相对要快一点,
    应为:在栈上创建对象相对要快一点,另to耙子前辈,>其实是Delphi不具有这些优秀语言特性,或者说语言的设计人和实现者所侧重的东西不同
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    >这个观点不敢苟同。请指教
      

  8.   

    因為 最早 設計 delphi的時候 是為了 具有 自動垃圾回收的才這麼做的..所以 對象都是引用的形勢...
      

  9.   

    var
       obj: someObj;//其实好似引用
    begin
      obj := SomeObj.Create;//在堆栈中建立obj对象.
    obj: 本身分配在棧 上obj := SomeObj.Create obj所引用的對象在堆上
      

  10.   

    如果Delphi开发组愿意,可以引入类似这样的一种语法:var
      obj: object TAnyClass(nil);
      obj2: TAnyClass;
    begin
      //编译器可以在入口处构造一个try/finally结构,并插入obj := TAnyClass.Create(nil)的代码,  obj2 := TAnyClass.Create(anyParam);  //出口处插入obj.Destroy();的代码
    end;修改GetMem和TObject的实现:
    type
      TObject = class
      ......
      class function NewInstance(aStackPtr: Pointer): TObject; virtual;
      end;class function TObject.NewInstance(aStackPtr: Pointer): TObject;
    begin
      if aStackPtr = nil then
        Result := InitInstance(_GetMem(InstanceSize))
      else Result := InitInstance(aStackPtr);
    end;procedure TObject.FreeInstance;
    var
      P: PUsed;
    begin
      CleanupInstance;
      P := Self;
      Dec(P);
      if (P^.sizeFalgs and cInStack) = 0 then
        _FreeMem(Self);
    end;
      

  11.   

    还有就是_ClassCreate再增加一个参数,aInStack: Boolean,最后传递给NewInstance
      

  12.   

    还有就是_ClassCreate再增加一个参数,aStackPtr: Pointer,最后传递给NewInstance
      

  13.   

    beyondtkl(大龙驹</*everything I do, I DO it for YOU*/>) 
    所说的就是我的意思.
    to alphax(无之心),你是想提供一个垃圾回收机制么.刚才把C++的几本经典教材过了一边,也没找到答案. 不过凭我的理解, delphi这样做确实节省资源,就象在C++中用引用一样.>>因為 最早 設計 delphi的時候 是為了 具有 自動垃圾回收的才這麼做的..
    那现在为什么没有这个呢?
      

  14.   

    to   flyinwuhan(制怒·三思而后行)
    class dog{...};
    void func1()
    {
       Dog dog;//memory malloc in Stack
      //推出该函数时候,系统自动回收Stack中的空间.
    }Dog dog;// memory malloc in data segmentint main()
    {
      dog.wwan()
    }void func2()
    {
      Dog* Pdog = new Dog;// memory malloc in heap!
      delete Pdog;        //so you must delete it;
    }
      

  15.   

    >>因為 最早 設計 delphi的時候 是為了 具有 自動垃圾回收的才這麼做的..
    那现在为什么没有这个呢?
    設計 delphi得哪個老大 後來去ms了呀 就沒有實現了 最初是這麼考慮設計得。。
    Dog dog;// memory malloc in data segment
    C++ 中 dog已經被構造出來了 而且是在棧上得
    delphi 這樣得聲明只是聲明dog為一個引用而已 類似C++中得 Dog *pDog;
    真正得構造 是 dog = Dog.Create;才是構造出來 才會在堆上分配內存,然後初始化.
      

  16.   

    void func1()
    {
       Dog dog;//memory malloc in Stack
      //推出该函数时候,系统自动回收Stack中的空间.
    }Dog dog;// memory malloc in data segment
    void func2()
    {
      Dog* Pdog = new Dog;// memory malloc in heap!
      delete Pdog;        //so you must delete it;
    }明白了,谢谢楼主!