2)
没有问题.
String类型其实是一个指针(你用SizeOf()测试一下就可以知道,无论你的字符串里有多少字,返回值都是4), Delphi会在内部维持一个引用记数,在没有人使用时候就会自动释放.

解决方案 »

  1.   

    对于第二个问题,s和result并不是使用的同一存储空间,局部栈是随函数的完成而释放,但返回值是返回至调用线程的空间,我说的也不大清楚,你翻一下编译原理就明白了
      

  2.   

    s在函数返回就被释放,而result有它自己的生存期,他们有各自的生存期的。
      

  3.   

    result实际上是delphi在后台添加的一个参数,函数
    function xpro:integer 相当于
    procedure xpro(var result:integer);
    所以可以正确返回值,至于生存期,应该是在返回值之后就释放result,可能是这样的:var
      i:integer;
    begin
      i:=xpro;  //获得result后result分配的空间被释放
      

  4.   

    你可以参考《Delphi5 技术参考手册》,里面有比较详细的说明
      

  5.   

    其实 Result 相当于一个指针:
    function Foo: integer;
    begin
      ...
      Result := 100;
    end;
    ...
    var n: integer;
    ...
    n := Foo; { 这里在调用 Foo 前就将 n 的地址传递给 Foo 函数(像 TechnoFantasy 说的,可以认为 Result 是一个特殊的隐藏的 Var 参数),到了 Foo 里的 Result 就是 n 的地址了 }
    ...
      

  6.   

    程序在执行时实际上有一个代码指针,它是按程序编译出的机器语言顺序执行的,当调用函数时,就把当前执行到的指针放入堆栈中,然后跳到所调用的函数地址开始执行,当函数返回时再从堆栈中把保存原来程序执行到的地址弹出赋给代码指针,程序也就可以继续顺序执行了。关于返回值我是这样理解的,大概是程序在开始时,根据函数返回值类型为其分配的内存,也就是说Result 相当于一个隐藏的全局变量。个人观点,仅供参考。(我是学硬件的,汇编语言是这样的,只不过的没有返回值而已)
      

  7.   

    谢谢csdn72(第八天) ,其他大侠还有什么意见?
      

  8.   

    result 和哪个s不是一回事,两个的值一样,在内存中的地址不一样。S是被释放掉了,但result 作为函数的返回值不会被释放掉的
      

  9.   

    基本上应该是这样:
    s是一个指针,指向堆中分配的字符串,引用计数为1
    result := s时,result 指向同一字符串,引用计数变为2
    返回时s被释放,引用计数减为1
    result 回到调用处,一般是通过AL/AX/EAX/EDX:EAX的方式返回到调用者处。
    如:Procedure yy;
    Var
      s1 : String;
    Begin
      s1 := xx;
    End;此时就是S1指向那个字符串,引用计数仍为1。直到YY退出时,S1被释放,引用计数为0,则堆中那个字符串才被释放。
      

  10.   

    关于第一个问题,delphi对全局变量自动初始化为0,另外我也没见过sockaddr_in必须在使用前置零的说法,应该看具体函数的要求。
    第二个问题前面都说了,我就不说了。